1

我正在使用以下方法清除输入缓冲区:

void dump_line(FILE *fp) {
    int ch;    
    while ( (ch = fgetc(fp)) != EOF && ch != '\n');
}

如果我使用 scanf() 从标准输入读取,这工作正常:

char string[51];
...
scanf("%50[^\n]", string);
dump_line(stdin);

但是,如果我使用 fgets() 代替,如以下代码所示:

char string[52];
...
fgets(string, 52, stdin);
dump_line(stdin);

// Since fgets() reads in the '\n', trim the end of the string:
string[strlen(string)-1] = 0;

由于 fgets() 读取 '\n' 字符,我发现需要分配一个大一个字符的缓冲区并将字符串修剪回一个字符。这工作正常,但 dump_line 函数存在问题。使用 scanf() 版本时,它按预期工作,因为由于使用 [^\n],输入缓冲区中总是会留下一个 '\n'。因此,即使这是缓冲区中剩下的唯一字符,在 dump_line() 中,fgetc() 也会读取该字符,并且由于它是一个 '\n',因此 while 循环被打破。

在 fgets() 版本中,如果 '\n' 适合字符串缓冲区,则读入它,而 stdin 则为空。这导致程序在 fgetc() 上等待,需要用户按回车键才能继续前进,这显然不是我想要的。另一方面,如果用户输入的字符串对于缓冲区来说太长,则 dump_line() 工作正常!

我猜这个问题与 EOF 有关,但我似乎无法让它按预期工作!任何帮助将不胜感激。

如果对我正在使用的平台有任何帮助,那就是 Mac OSX,以防万一这是某种特定于平台的怪癖。

4

2 回答 2

5

检查是否需要清除缓冲区,

fgets(string, 52, stdin);
size_t len = strlen(string);
if (string[len-1] == '\n') {
    // read in whole line, no need to clear buffer
    string[len-1] = 0;
} else {
    // junk left in buffer, clear it
    dump_line(stdin);
}
于 2013-01-17T16:56:58.177 回答
1

您可以使用ungetc将换行符放回流中。

于 2013-01-17T16:55:43.520 回答