<!--
我深思这个好几个小时但是不能弄清楚.. 仅使用stdio.h
string.h是不允许的,但只使用基本的东西..
我怎样才能获得字符串长度?有人请帮帮我。
目标是找到给定字符串中输入模式的频率
ex)ha =&gt; 2,di =&gt; 1 ..
帮帮我。
答案 0 :(得分:3)
至于字符串的长度,strlen
的实现并不复杂
您应该做的就是遍历字符串,直到找到\0
(字符串结尾)并计算您循环的次数。
unsigned int mystrlen(const char* str)
{
unsigned int length = 0;
while (*str != 0)
{
str++;
length++;
}
return length;
}
这可以缩短为
unsigned int len = 0;
for (; str[len]; len++);
答案 1 :(得分:0)
纯C中的字符串只是指向内存的指针。 如果最后一个元素是0,那么你可以使用strlen或其他任何检查。 但如果不是这种情况,则需要记住变量中的长度。
因此,如果它是0终止只是循环到第一个元素是0(不是&#39; 0&#39;),那就结束了。如果您计算了元素,那么你就有了字符串长度。
答案 2 :(得分:0)
这适用于某些测试输入字符串,但我强烈建议在更多情况下进行检查。
假设我们已实施strstr()
。
<强> strstr()
强>
来自string.h
库
char *strstr(const char *haystack, const char *needle)
此函数查找源字符串needle
中第一次出现的子串haystack
。
不会比较终止\0
字符。
source: TutorialsPoint (有些版本)
<强>代码强>
#include <stdio.h>
#include <string.h>
unsigned int Neostrlen(const char* str)
{
unsigned int length = 0;
while (*str != 0)
{
str++;
length++;
}
return length;
}
int BluePIXYstrlen(char* str)
{
int len = 0;
sscanf(str, "%*[^0]%n", &len);
return len;
}
int Jeanfransvastrlen(char* str)
{
int i;
for (i=0;str[i];i++);
return i;
}
int main(int argc, char **argv){
//is it true, no need to malloc????
char* str =
"\
P-P-A-P\
I have a pen, I have a apple\
Uh! Apple-Pen!\
I have a pen, I have pineapple\
Uh! Pineapple-Pen!\
Apple-Pen, Pineapple-Pen\
Uh! Pen-Pineapple-Apple-Pen\
Pen-Pineapple-Apple-Pen\
";
printf("len: %d\n", Jeanfransvastrlen(str));
printf("len: %d\n", Neostrlen(str));
printf("len: %d\n", BluePIXYstrlen(str));
printf("sss:%s\n\n\n", str);
char * search = "have";//search for this substring
int lenSr= Neostrlen(search);
printf("lenSr: %d\n", lenSr);
char * ret;
ret = strstr(str, search);
int count = 0;
while (ret){
//printf("The substring is: %s\n\n\n\n", ret);
count++;
for (int i=0;i<lenSr;i++){
printf("%c", ret[i]);
}
printf("\nEnd sub\n");
for (int i=0;i<lenSr;i++){
ret++;
}
ret = strstr(ret, search);
}
printf("count: %d\n", count);
return 0;
}
<强>被修改强>
仅使用stdio.h
,您可以使用leetcode
strstr()
版本替换所有mystrstr()
<强> mystrstr()
强>
char* mystrstr(char *str, const char *target) {
if (!*target) {
return str;
}
char *p1 = (char*)str;
while (*p1) {
char *p1Begin = p1, *p2 = (char*)target;
while (*p1 && *p2 && *p1 == *p2) {
p1++;
p2++;
}
if (!*p2){
return p1Begin;
}
p1 = p1Begin + 1;
}
return NULL;
}
<强>提示强>
我从const
的第一个参数中删除了mystrstr()
因为我想稍后更改它,这是我对原始代码所做的唯一更改。
此版本对字符串中的大写和小写字母很敏感,
例如,Apple
与apple
不同。
正如chux在评论中所说,我的代码从源代码返回"ababa"
的子字符串
仅"aba"
{aba}
而不是while
。这是因为我在最后for
中更改了strstr()
内的字符串指针。
<强>建议强>
尝试实施您的strlen()
和number