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
将字符串打印为十六进制,您将看到包含换行符 \n
或 0x0A
:
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 char
到 int
提升的代码,并从循环中删除了不必要的 strlen
,正如@phuclv 所推荐的那样。
fgets() 函数在输入的字符串末尾添加一个'\n'字符。这就是 strlen() 返回 +1 值的原因。因此,strlen() 没有返回错误的长度,而是您输入的字符串有一个额外的字符。
或者更准确地说,输入字符串的末尾总是有一个换行符,但 fgets() 不会将其删除,这与其他函数(如 scanf() 或 gets(不要使用它)不同!)
如果你打印字符串最后一个元素的ASCII字符,你会看到它正在打印10.
而10是换行符的ASCII值。
#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
将字符串打印为十六进制,您将看到包含换行符 \n
或 0x0A
:
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 char
到 int
提升的代码,并从循环中删除了不必要的 strlen
,正如@phuclv 所推荐的那样。
fgets() 函数在输入的字符串末尾添加一个'\n'字符。这就是 strlen() 返回 +1 值的原因。因此,strlen() 没有返回错误的长度,而是您输入的字符串有一个额外的字符。
或者更准确地说,输入字符串的末尾总是有一个换行符,但 fgets() 不会将其删除,这与其他函数(如 scanf() 或 gets(不要使用它)不同!)
如果你打印字符串最后一个元素的ASCII字符,你会看到它正在打印10.
而10是换行符的ASCII值。