在Windows上使用scanf作为字符串时双Ctrl + D输入

时间:2017-01-26 12:37:37

标签: c string scanf eof

在这种情况下,我有一个代码读取值直到用户输入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

2 个答案:

答案 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();调用以清除输入缓冲区之后。

祝你好运