此问题在此处已有答案:
Removing trailing newline character from fgets() input(15个答案)
3天前关闭。
我尝试使用fgets
和strlen
查找输入字符串的长度,但遇到了一些无法检测空终止字符的问题。
所谓空输入字符串,我指的是只按回车键而不输入任何内容。
我在输入空字符串时使用了strlen
,并输出了1
,其中is应为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
1条答案
按热度按时间gmxoilav1#
函数
fgets
可以在输入的字符串后面附加新的行字符'\n'
,如果目标字符数组有足够的空间容纳它,则该行字符'\n'
对应于按下的Enter键。来自C标准(7.21.7.2 fgets函数)
2 fgets函数最多从stream指向的流中读取比n指定的字符数少1的字符到s指向的数组中。在换行符(保留)或文件结尾之后不读取其他字符。在读入数组的最后一个字符之后立即写入空字符。
因此,在您刚刚按下Enter键的情况下,数组
input
如下所示所以
input[0]
不等于'\0'
。input[0]
将等于'\n'
。如果像这样声明数组
并且在输入字符串时将立即按下Enter键,则实际上
input[0]
将等于'\0'
,因为目标数组没有空间来存储新的行字符'\n'
。如果要从输入的字符串中删除换行符,可以编写如下代码