通常, strlen() 不计算字符串末尾的空终止符。但是,下面的代码使用空终止符打印字符串计数。谁能解释我为什么?谢谢
char str2[100];
printf("\nEnter a string: ");
fgets (str2, sizeof(str2), stdin);
printf("\n%d",strlen(str2));
通常, strlen() 不计算字符串末尾的空终止符。但是,下面的代码使用空终止符打印字符串计数。谁能解释我为什么?谢谢
char str2[100];
printf("\nEnter a string: ");
fgets (str2, sizeof(str2), stdin);
printf("\n%d",strlen(str2));
我假设前面的fgets
提示拿起了这个newline
角色。
例如:
你放进去apple
。
在内部,您的字符串存储为apple\n\0
.
strlen
然后返回6
+apple
'\n'
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));
在这里,您使用了 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));
}
正如其他人所说, 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));
fgets()
读取直到\n
遇到。
如果用户输入anshul
则将str2
包含anshul\n\0
.
strlen()
将返回 7,因为strlen()
搜索直到找到 NULL('\0') 字符。
当您在完成输入字符串后按回车键时,gets(s) 不包括 '\n'。但是, fgets() 在从文件中读取时确实包括 '\n'。
根据 linux 终端上的手册页(使用:man fgets),
fgets() 从流中最多读入一个小于 size 的字符,并将它们存储到 s 指向的缓冲区中。在 EOF 或换行符后停止读取。如果读取了换行符,则将其存储到缓冲区中。终止的空字节 ('\0') 存储在缓冲区中的最后一个字符之后。