C:从标准输入扫描

时间:2014-02-27 03:53:45

标签: c stdin scanf

我正在编写代码,当从命令行调用时,会重定向文件。解析并读取文件的行(通过stdin发送)。我希望能够调用一个函数并让它扫描一个int,但似乎scanf中存在残留数据的问题(我实际上并不知道这是否是问题,但这是我能想到的)。这是我的代码:

dataSetAnalysis(data, experiments);
int selection;
while(1){ //always true. The loop only breaks when the user inputs 4.
    printf("DATA SET ANALYSIS\n"
           "1. Show all the data.\n"
           "2. Calculate the average for an experiment.\n
           "3. Calculate the average across all experiments.\n
           "4. Quit.\n"
           "Selection:__");
    switch(selection){
    case 1:
        displayAll(d,e);
        break;
    case 2:
        individualAverage(d,e);
        break;
    case 3:
        allAverage(d);
        break;
    case 4:
        exit(0);
    }
    scanf("%d", &selection);
}

这是主要方法的后半部分。

while(fgets(currentLine, 20, ifp) != NULL){ //while there is still data in stdin to be read

    experiments[i] = currentLine; //experiment[i] points to the same value as current line. Each value in experiments[] should contain pointers to different positions in the allocated buffer array.
    currentLine += 20; //currentLine points 20 characters forward in the buffer array.

    int j = 0; //counter for the inner while loop

    while(j<10){ //while j is less than 10. We know that there are 10 data points for each experiment
        scanf("%d ", &intBuffer[j]);
        data[i][j] = intBuffer[j];
        j++;
    }

    numExperiments++; //each path through this loop represents one experiment. Here we increment its value.
    i++;
}

程序在到达dataSetAnalysis()中的while循环时无限循环,并继续打印“DATA SET ANALYSIS ....”而不停止接受stdin上的更多输入。扫描到选择变量有问题吗?

2 个答案:

答案 0 :(得分:0)

第一条和基本规则是“始终检查输入函数的返回值”(例如scanf())。它们总是返回一些是否成功的指示,如果它们不成功,则不应使用函数调用成功时设置的值。

使用scanf()等,使用该函数的正确方法是测试您是否获得了预期的转换值数量:

if (scanf("%d", &intBuffer[j]) != 1)
   …handle error…

您还可以在代码中使用格式字符串:"%d "。直到您在数字后面键入非空格字符时才会停止。这很令人困惑,但格式字符串中的任何空格(空格,制表符,换行符)都意味着读取可选的空格,但该函数仅在输入非空格字符时才知道它何时读完空格。

答案 1 :(得分:0)

问题是你的stdin不清楚,你必须通过迭代清除你的输入缓冲区,直到找到'\ n'或输入命中。

尝试使用此

while('\ n'!= getchar()) {}

在scanf之前,它将摆脱无限循环

类似

while('\n' != getchar()) {} scanf("%d", selection);