strlen()返回带有null终止符的字符串计数

时间:2013-05-01 07:40:50

标签: c

通常,strlen()不计算字符串末尾的空终止符。但是,下面的代码使用null终止符打印字符串计数。谁能解释我为什么?感谢

char str2[100];
printf("\nEnter a string: ");
fgets (str2, sizeof(str2), stdin);
printf("\n%d",strlen(str2));

6 个答案:

答案 0 :(得分:41)

我假设前面的fgets提示已选中newline字符。

例如:

你输入apple

在内部,您的字符串存储为apple\n\0

strlen然后返回6 apple + '\n'

答案 1 :(得分:4)

fgets()函数在遇到换行符(使用stdin时输入键)时接受输入,并且换行符\n被函数视为有效字符并包含在内在复制到str2的字符串中。因此,当您将其作为参数传递给strlen()时,它会比字符串中的原始字符数多一个,以便考虑额外的\n个字符

如果您想要原始的字符数或者不希望添加\n,请使用gets()功能,因为它不会复制换行符。并且,您只需要将字符串作为参数传递,不需要传递流(stdin),因为gets()的默认流是stdin

char str2[100];
printf("\nEnter a string: ");
gets(str2);
printf("\n%d",strlen(str2));

答案 2 :(得分:2)

这里你使用了fgets()函数来获取输入。当你通过fgets()函数接收输入时,你的sting会添加一个额外的新行字符(' \ n')。假设你的输入是:"你好" 。键入此sting后,您必须按ENTER键,将新的行字符添加到您的字符串。因此,你似乎strlen()计算null终止符。但是如果使用scanf()函数进行输入,则在按下ENTER时不会添加额外的新行字符(' \ n')。因此,您将看到字符串包含的确切字符数。运行以下代码以查看我的解释。

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

void main()
{
char str2[100];
printf("\nEnter a string: ");
scanf("%s",str2);
//fgets (str2, sizeof(str2), stdin);
printf("\n%d",strlen(str2));
}   

答案 3 :(得分:2)

如其他人所说,fgets()将读取换行符(\ n)并将其存储在数组中。

每次调用fgets()后,我总是使用strcspn()来搜索数组/指针以找到换行符并将其替换为空字符。

char str2[100];
printf("\nEnter a string: ");
fgets (str2, sizeof(str2), stdin);

//new line of code to replace '\n' with '\0'
str2[strcspn(str2, "\n")] = '\0';

printf("\n%d",strlen(str2));

答案 4 :(得分:1)

fgets()读取,直到遇到\n

如果用户输入anshul,则str2将包含anshul\n\0

strlen()将返回7,因为strlen()会搜索,直到找到NULL('\ 0')字符。

答案 5 :(得分:0)

完成输入字符串后,当你按下回车键时,

gets(s)不包括'\ n'。但是,fgets()在从文件中读取时包含'\ n'。

根据linux终端上的手册页(使用:man fgets),

fgets()从流中读取最多一个小于大小的字符,并将它们存储到s指向的缓冲区中。 EOF或a之后读取停止        新队。如果读取换行符,则将其存储到缓冲区中。终止空字节('\ 0')存储在缓冲区中的最后一个字符之后。

相关问题