strlen() 返回错误值

strlen() returning a wrong value

#include <stdio.h>
#include <string.h>

int main()
{
  char string[100];

  printf("Input string: ");
  fgets(string, sizeof(string), stdin);
  printf("%ld\n", strlen(string));

  return 0;
}

据我所知,strlen() returns 不包括 \0 的字符串长度,但是当我输入“hello”时,它 returns 值为 6

将字符串打印为十六进制,您将看到包含换行符 \n0x0A

size_t i = 0;
for (; string[i] != 0; i++) {

    printf("string[%zu] = %02X\n", i, (unsigned char)string[i]);
}

输出:

Input string: hello
6
string[0] = 68
string[1] = 65
string[2] = 6C
string[3] = 6C
string[4] = 6F
string[5] = 0A

编辑:修复了无法正确处理 signed charint 提升的代码,并从循环中删除了不必要的 strlen,正如@phuclv 所推荐的那样。

fgets() 函数在输入的字符串末尾添加一个'\n'字符。这就是 strlen() 返回 +1 值的原因。因此,strlen() 没有返回错误的长度,而是您输入的字符串有一个额外的字符。

或者更准确地说,输入字符串的末尾总是有一个换行符,但 fgets() 不会将其删除,这与其他函数(如 scanf() 或 gets(不要使用它)不同!)

如果你打印字符串最后一个元素的ASCII字符,你会看到它正在打印10.而10是换行符的ASCII值。