这可能是微不足道的,我希望有人可以解释一下。为什么strlen给我的数字大于这个实际大小的char数组而不是4: 这是我的代码:
#include <stdio.h>
#include <string.h>
int main ()
{
char szInput[4];
szInput [0] = '1';
szInput [1] = '1';
szInput [2] = '1';
szInput [3] = '1';
printf ("The sentence entered is %u characters long.\n",(unsigned)strlen(szInput));
return 0;
}
我以为我应该得到4作为输出,但我得到6.
输入的句子长度为6个字符。
答案 0 :(得分:4)
strlen
时, '\0'
才有效。 (它返回最多但不包括该终结符的字符数。)
如果不存在,则程序行为未定义。你得到答案的事实完全是巧合。
如果你写了szInput[3] = '\0';
,那么你的程序将被明确定义,答案将是3.你可以写szInput[3] = 0;
但'\0'
通常是首选,为了清晰(和惯例)在处理char
文字时。
答案 1 :(得分:2)
您必须使用'\0'
结束字符串,如下所示:
#include <stdio.h>
#include <string.h>
int main () {
char szInput[5];
szInput [0] = '1';
szInput [1] = '1';
szInput [2] = '1';
szInput [3] = '1';
szInput [4] = '\0';
printf ("The sentence entered is %u characters long.\n", (unsigned)strlen(szInput));
return 0;
}
答案 2 :(得分:1)
字符串末尾缺少'\0'
。
#include <stdio.h>
#include <string.h>
int main ()
{
char szInput[5];
szInput [0] = '1';
szInput [1] = '1';
szInput [2] = '1';
szInput [3] = '1';
szInput [4] = '\0';
printf ("The sentence entered is %u characters long.\n", (unsigned int)strlen(szInput));
return 0;
}
你应该总是在你的字符串中添加一个额外的字符来标记它的结尾,这个额外的特殊值是'\0'
。
string.h
标头中的所有函数都期望这样,strlen()
以导致未定义行为的方式工作,因为您省略了终止'\0'
,一个简单的实现看起来像< / p>
size_t length;
while (*(str++) != '\0')
length++;
如果永远找不到'\0'
,这可能超出界限。