15

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

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

6 回答 6

47

我假设前面的fgets提示拿起了这个newline角色。

例如:

你放进去apple

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

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

于 2013-05-01T07:45:37.910 回答
5

fgets()当遇到换行符(使用时输入键)时,该函数接受输入stdin,并且换行符\n被该函数视为有效字符并包含在复制到您的字符串中 str2。因此,当您将其作为参数传递给strlen()它时比字符串中的原始字符数多 1 以说明附加\n字符。

如果您想要原始字符数或不想\n添加 a,请使用该gets()函数,因为它不会复制换行符。此外,您只需将字符串作为参数传递,无需传递流( stdin) 作为gets()is的默认流stdin

char str2[100];
printf("\nEnter a string: ");
gets(str2);
printf("\n%d",strlen(str2));
于 2013-05-01T08:42:35.170 回答
2

在这里,您使用了 fgets() 函数来获取输入。当您通过 fgets() 函数进行输入时,您的字符串中将添加一个额外的换行符('\n')。假设您的输入是:“你好”。键入此字符串后,您必须按 ENTER 键,新行字符将与您的字符串一起添加。因此,在您看来, strlen() 计算空终止符。但是,如果您使用 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));
}   
于 2013-05-01T08:12:34.940 回答
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));
于 2016-11-10T22:07:20.657 回答
1

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

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

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

于 2013-05-01T07:52:41.803 回答
0

当您在完成输入字符串后按回车键时,gets(s) 不包括 '\n'。但是, fgets() 在从文件中读取时确实包括 '\n'。

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

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

于 2016-07-24T04:55:00.083 回答