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

program not detecting null terminating character when input through function [duplicate]

提问人:Mr Habibbi 提问时间:3/13/2023 最后编辑:Andreas WenzelMr Habibbi 更新时间:3/13/2023 访问量:23

问:

我试图使用 和 查找输入字符串的长度,但我遇到了一些无法检测到 null 终止字符的问题。fgetsstrlen

空输入字符串是指只需按回车键而不输入任何内容。

我已经在空字符串的输入和输出中使用了 is 应该是 .strlen10

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

c 输入 null fgets

评论

2赞 Jabberwocky 3/13/2023
阅读以下文档: (换行符)由 fgets 存储,因此如果您只需按 Enter 键,缓冲区的内容将是 ,即一个换行符后跟一个空字符。fgets\n"\n"

答:

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';