通过函数[duplicate]输入时,程序未检测到空终止字符

0yycz8jy  于 2023-03-17  发布在  其他
关注(0)|答案(1)|浏览(92)

此问题在此处已有答案

Removing trailing newline character from fgets() input(15个答案)
3天前关闭。
我尝试使用fgetsstrlen查找输入字符串的长度,但遇到了一些无法检测空终止字符的问题。
所谓空输入字符串,我指的是只按回车键而不输入任何内容。
我在输入空字符串时使用了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

gmxoilav

gmxoilav1#

函数fgets可以在输入的字符串后面附加新的行字符'\n',如果目标字符数组有足够的空间容纳它,则该行字符'\n'对应于按下的Enter键。
来自C标准(7.21.7.2 fgets函数)
2 fgets函数最多从stream指向的流中读取比n指定的字符数少1的字符到s指向的数组中。在换行符(保留)或文件结尾之后不读取其他字符。在读入数组的最后一个字符之后立即写入空字符。
因此,在您刚刚按下Enter键的情况下,数组input如下所示

{ '\n', '\0' }

所以input[0]不等于'\0'input[0]将等于'\n'
如果像这样声明数组

char input[1];

并且在输入字符串时将立即按下Enter键,则实际上input[0]将等于'\0',因为目标数组没有空间来存储新的行字符'\n'
如果要从输入的字符串中删除换行符,可以编写如下代码

input[ strcspn( input, "\n" ) ] = '\0';

相关问题