我必须按两次CTRL + D才能结束输入,为什么?如何纠正?

时间:2013-10-05 11:00:31

标签: c

我应该写一个这里指定的程序:

Input

The input will consist of a series of pairs of integers a and b,separated by a space, one pair of integers per line. you should read the input until EOF.
Output

For each pair of input integers a and b you should output the sum of a and b in one line,and with one line of output for each line in input.
Sample Input

1 5
7 2

Sample Output

6
9
我写这个:      

     #include 

 main() {
 int a, b;
 int sum[100];
 int i,j;
 char c;

 for(i=0; i<100; i++) sum[i]=0;

 i=0;
 do {
    scanf("%d %d", &a, &b);
sum[i]=a+b;
    i++;
  } while((c=getchar())!=EOF);

 for(j=0; j<i-1; j++) printf("%d\n", sum[j]);
 }

对我来说奇怪的是:我为什么要按两次CTRL + D(EOF)来结束输入?有没有更好的方法来编写这段代码?

3 个答案:

答案 0 :(得分:0)

您的代码不应依赖EOFgetchar()击中。改变这个:

do {
    scanf("%d %d", &a, &b);
    ...
} while((c=getchar())!=EOF);

为:

do {
    if (scanf("%d %d", &a, &b) != 2)
        break;
    ...
} while((c = getchar()) != EOF);

或者,您可以完全省略getchar()来电:

while (scanf("%d %d", &a, &b) == 2) {
    ...
} 

答案 1 :(得分:0)

你的第一个CTRL-D打破了scanf。之后你的程序在getchar中等待。如果检查scanf的输出,则只有一个检查。

#include <stdio.h>


main() {
    int a, b;
    int sum[100];
    int i,j;
    char c;

    for(i=0; i<100; i++) sum[i]=0;

    i=0;
    while ( 2==scanf("%d %d", &a, &b))
    {   
        sum[i]=a+b;
        i++;
    }   

    for(j=0; j<i-1; j++) printf("%d\n", sum[j]);
}  

答案 2 :(得分:0)

scanf()读取您的输入行时,它会读取这两个数字,但它会在输入流中留下终止该行的换行符。然后当getchar()读取下一个字符时,它会读取该换行符。由于换行不是EOF,它返回循环的开头。

现在scanf()再次运行,它会看到您在换行符后输入的EOF。它返回时不更新变量。然后再次调用getchar(),你必须输入另一个EOF来获取它。