C:从标准输入扫描

C:从标准输入扫描,c,stdin,scanf,C,Stdin,Scanf,我正在编写的代码,当从命令行调用时,会重定向到一个文件。解析并读取文件的行(通过stdin发送)。我希望能够调用一个函数并让它扫描一个int,但似乎scanf中的剩余数据存在问题(我不知道这是否是问题所在,但这就是我所能想到的)。这是我的密码: dataSetAnalysis(data, experiments); int selection; while(1){ //always true. The loop only breaks when the user inputs 4. pr

我正在编写的代码,当从命令行调用时,会重定向到一个文件。解析并读取文件的行(通过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++;
}
while(fgets(currentLine,20,ifp)!=NULL){//stdin中仍有数据需要读取时
实验[i]=currentLine;//实验[i]指向与当前行相同的值。实验[]中的每个值应包含指向分配的缓冲区数组中不同位置的指针。
currentLine+=20;//currentLine在缓冲区数组中向前指向20个字符。
int j=0;//内部while循环的计数器

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

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

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

代码中还有格式字符串:
“%d”
。在数字后面键入一个非空白字符之前,这不会停止。这很容易混淆,但任何空白(空白、制表符、换行符)在格式字符串中,表示读取可选空白,但函数只知道在输入非空白字符时何时读取完空白。

问题是您的stdin不清晰,您必须通过迭代清除输入缓冲区,直到找到“\n”或enter hit

试试这个

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

在扫描之前,它将消除无限循环

差不多

while('\n'!=getchar())
{}
scanf(“%d”,选择);

好的,所以我使用空格b/c,输入的格式是空格,如下所示:但是你是说scanf没有正常工作,返回值会提示这一点吗?这部分代码似乎运行正常。你不需要空格,因为
%d
跳过了前导空格。事实上,所有转换规范ept
%c
%[…]
跳过前导空格。我不清楚代码是如何工作的,但如果您正在向程序键入输入(而不是从文件重定向),则
%d
在输入空格以外的内容之前,它不会停止读取。因此,在读取
9
之后,它将等待您输入空格、制表符或换行符以外的内容,然后再返回到您的程序。好的,扫描可以在没有空格的情况下进行。但这并不能解决程序无法正常运行的问题在dataSetAnalysis()中执行while循环时是否曾停止扫描。这两个问题是否相关?请研究如何创建MCTRE或SSCCE()。我不知道在哪里发生了什么。