在这种情况下,我有一个代码读取值直到用户输入Ctrl + D,但问题是我必须输入TWICE才能成功退出循环,我认为它必须这样做事实上,Ctrl + D与缓冲区的剩余部分一起被插入到字符串中,因此没有注册为EOF,只是字符串中的另一个字符,只有第二个Ctrl + D将被保存在一个int变量,实际上停止了读取循环。为了解决这个问题,我添加了 while(getchar()!=' \ n')来查看它是否解决了问题,但是没有结束。 这是我的代码:
typedef struct {
char nome[50];
int tempo;
int ncertas;
} equipa;
int ler_equipas(equipa *resultados)
{
int x, r1, r2 ,r3 ,r4, r11, r22, r33 ,r44, rcertas = 0, i = 0;
scanf ("%d %d %d %d", &r1, &r2, &r3, &r4);
while (scanf ("%s %d %d %d %d %d", resultados[i].nome, &resultados[i].tempo, &r11, &r22, &r33, &r44 ) == 6 )
{
i++;
if (r1 == r11) rcertas++;
if (r2 == r22) rcertas++;
if (r3 == r33) rcertas++;
if (r4 == r44) rcertas++;
resultados[i-1].ncertas = rcertas;
rcertas = 0;
while((x=getchar()) != '\n');
}
return i;
}
输入/输出如下(">>"表示输出):
1 2 3 4
>> correct answers are 1 2 3 4
Team1 234 1 2 3 4
>> values inputed for team time and answers: Team1 234 1 2 3 4
>> getchar value was (ASCII): 10
>> Next read:
Team2 400 1 3 2 4
>> values inputed for team time and answers: Team2 400 1 3 2 4
>> getchar value was (ASCII): 10
>> Next read:
>>
^D
^D
>> return i was reached
>> Number of teams: 2
>> Team "Team1" took 234 seconds and answered 4 questions correctly
>> Team "Team2" took 400 seconds and answered 2 questions correctly
答案 0 :(得分:1)
由于您使用的是Windows,因此您应使用ctrl+z
来模拟EOF
请参阅https://stackoverflow.com/a/16136924/4386427
当您使用ctrl+d
时,第一个ctrl+d
与初始%s
匹配,因此扫描会继续。
第二个ctrl+d
与%d
不匹配,因此扫描会终止。由于扫描元素的数量不是6,因此while
循环终止。
因此,两个ctrl+d
终止了该功能。单个ctrl+z
也将终止该程序。
答案 1 :(得分:0)
我还没试过。但我记得有同样的问题......
试试这个:How to clear input buffer in C?
while ((c = getchar()) != '\n' && c != EOF) { }
这是清除输入缓冲区的一种方法。
但是在scanf();
调用以清除输入缓冲区之后。
祝你好运