首页 文章

c - 奇怪的fgets()行为

提问于
浏览
1

我编写的以下代码应该打开一个作为输入,写入和读取的文件 .

  • fopen()正常工作,我可以访问该文件 .

  • fprintf()也按预期工作 .

但至于fgets - 如果我使用if命令如图所示条件为真,如果我没有得到输入[0]是'\ n'字符而输入[1]是'h',并且循环运行没有停止,因为fgets()一次又一次地读取第一个字符 .

此外,似乎fgets()没有前进并已将所有文件读入输入 - 我可以打印输入[3]并按预期获得'l',尽管fgets()被命令只读取2个字符 .

int main(int argc, char *argv[])
{
    FILE* read = NULL;
    read = fopen(name, "a+");

    char* input = "";

    fprintf(read, "hello world\n");
    fprintf(read, "hello world\n");

    assert(ferror(read) == 0);

    while(!feof(read))
    {
        if(fgets(input, 2, read)==NULL)
            return 0;
        printf("%c\n", input[1]);


    }
return 0;
}

2 回答

  • 1
    char* input = "";
    

    这使 input 指向一个字符串常量,特别是一个空字符串 .

    if(fgets(input, 2, read)==NULL)
    

    这会尝试修改 input 指向的内容 . 由于 input 指向字符串常量,因此尝试修改字符串常量 . 但是,根据定义,你可以't modify a constant -- that' s使它保持不变 .

  • 1

    printf("%c\n", input[1]); 永远打印nul char

    手册页是你的朋友 .

    fgets()从流中读取最多一个小于大小的字符,并将它们存储到s指向的缓冲区中 . 读数在EOF或换行符后停止 . 如果读取换行符,则将其存储到缓冲区中 . 终止空字节(aq \ 0aq)存储在缓冲区中的最后一个字符之后 .

相关问题