strlen给出的数字大于数组的大小

时间:2015-01-19 15:48:59

标签: c strlen

这可能是微不足道的,我希望有人可以解释一下。为什么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个字符。

3 个答案:

答案 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',这可能超出界限。