当您使用getchar,fgets或一些类似的函数从stdin中读取内容时,如果键入一些文本然后放入eof(在Linux中为control + d),则无法删除之前的文本。例如,如果我键入“程序”,然后通过按Ctrl + d输入eof,则无法删除之前输入的内容,即“程序”。

#include<string.h>
#include<stdlib.h>

int main() {

    char buffer[1024] = "";
    printf("> ");
    if(fgets(buffer,sizeof(buffer),stdin) == NULL){
        puts("eof");
    }
    else{
        puts(buffer);
    }

    return 0;
}


如何避免这种情况?

最佳答案

我认为,GNU Readline库的readline函数是完成这项工作的最佳选择。使用起来非常简单,但是它使用动态内存来托管字符串,因此您必须使用free函数来释放内存。您可以通过打开终端并键入“ man readline”来查找更多信息。
代码如下所示:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <readline/readline.h>

int main() {

    char *ptr = readline("> ");
    if(!ptr){
        puts("eof");
    }
    else{
        puts(ptr);
    }
    free(ptr);

    return 0;
}


为了能够在gcc中使用readline,必须将其传递给-lreadline

关于c - 当按下Ctrl + D时,fgets不会停止阅读,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56509336/

10-15 01:20