通常,strlen()不计算字符串末尾的空终止符。但是,下面的代码使用null终止符打印字符串计数。谁能解释我为什么?感谢
char str2[100];
printf("\nEnter a string: ");
fgets (str2, sizeof(str2), stdin);
printf("\n%d",strlen(str2));
答案 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')存储在缓冲区中的最后一个字符之后。