提问人:Mr Habibbi 提问时间:3/13/2023 最后编辑:Andreas WenzelMr Habibbi 更新时间:3/13/2023 访问量:23
程序在通过函数 [duplicate] 输入时未检测到 null 终止字符
program not detecting null terminating character when input through function [duplicate]
问:
我试图使用 和 查找输入字符串的长度,但我遇到了一些无法检测到 null 终止字符的问题。fgets
strlen
空输入字符串是指只需按回车键而不输入任何内容。
我已经在空字符串的输入和输出中使用了 is 应该是 .strlen
1
0
int func(char *input) {
if (input[0] == '\0')
printf("null detected\n");
else
printf("null not detected\n");
printf("len: %lu", strlen(input));
}
int main() {
char input[256];
fgets(input, sizeof(input), stdin);
func(input);
return 0;
}
输出:null not detected
正确输出:null detected
答:
0赞
Vlad from Moscow
3/13/2023
#1
如果目标字符数组有足够的空间来容纳输入的字符串,则该函数可以在输入的字符串后面附加与按下的 Enter 键相对应的新行字符。fgets
'\n'
来自 C 标准(7.21.7.2 fgets 函数)
2 fgets 函数读取的次数最多比 n 指定的字符,来自流指向的流 into S 指向的数组。在 换行符(保留)或文件末尾之后。空 字符紧跟在读入的最后一个字符之后 数组。
因此,在您的情况下,当您按下Enter键时,数组看起来像input
{ '\n', '\0' }
所以不等于 . 将等于 。input[0]
'\0'
input[0]
'\n'
如果将数组声明为
char input[1];
并在输入字符串时立即按下 Enter 键,然后确实等于,因为目标数组没有空格来存储换行符。input[0]
'\0'
'\n'
如果要从输入的字符串中删除换行符,可以编写例如
input[ strcspn( input, "\n" ) ] = '\0';
下一个:为什么我不能返回 NULL?
评论
fgets
\n
"\n"