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

strlen gives larger number than the size of an array

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

The sentence entered is 6 characters long.

你必须像这样用 '[=11=]' 结束你的字符串:

#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] = '[=10=]';

    printf ("The sentence entered is %u characters long.\n", (unsigned)strlen(szInput));

    return 0;

}

字符串末尾缺少'[=12=]'

#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] = '[=10=]';

    printf ("The sentence entered is %u characters long.\n", (unsigned int)strlen(szInput));
    return 0;
}

你应该总是在你的字符串中添加一个额外的字符来标记它的结束,这个额外的特殊值是 '[=12=]'

string.h header 中的所有函数都期望这一点,strlen() 的工作方式会导致未定义的行为,因为您省略了终止 '[=12=]',a简单的实现看起来像

size_t length;
while (*(str++) != '[=11=]') 
    length++;

如果从未找到 '[=12=]',这可能会越界读取。

strlen 仅当字符数组中存在空终止符 '[=11=]' 时才有效。 (它 returns 最多但不包括该终止符的字符数)。

如果不存在则程序行为未定义。你能得到答案纯属巧合。

如果你写了 szInput[3] = '[=12=]'; 那么你的程序将是明确定义的,答案将是 3。你可以写 szInput[3] = 0; 但为了清晰起见通常首选 '[=11=]' (并且约定)在处理 char 文字时。