我必须为使用并行数组来存储学生成绩数据的类做一个程序。我们将使用Linux命令“<”来提供数组数据执行程序时。
./a.out < inputfile
然而,当我运行程序时,我得到一个程序用来访问数组中数据的菜单的无限循环。看起来程序正在跳过我正在使用的函数来填充函数中的数组,并使用文件中的数据作为单独函数中的菜单scanf()。
这是我用来填充数组的函数:
void populate(int idarray[],int testone[], int testtwo[],float hw[],int max)
{
int counter = 0;
while(scanf("%d", &idarray[counter]) != EOF)
{
if(idarray[counter] != -1)
{
//scanf("%f %d %d", &hw[counter], &testone[counter], &testtwo[counter]);
scanf("%f",&hw[counter]);
scanf("%d",&testone[counter]);
scanf("%d",&testtwo[counter]);
counter++;
}
if(counter == max-1)
break;
}
}
“max”是数组的范围。
输入文件如下所示:
1983990 75.6 39 78 1935440 50.03 78 34
答案 0 :(得分:1)
检查你的while循环是否因counter == max - 1或EOF而中断。如果它是前者那么你仍然会在stdin中输入,这将作为你的菜单选项的输入而不受你的控制
说明: 如果你的while循环因&#34; counter == max -1&#34;而中断?这意味着你的&#34; max&#34;(数组大小)较小 而不是输入文件中的输入总数(十进制数)。如果你的&#34; max&#34;(数组大小)合适,那么它只会被EOF破坏。 现在,如果在达到EOF之前有一段时间中断,那意味着你没有消耗你传递给stdin的所有输入十进制数,这意味着将有剩余的输入数字被消耗 甚至在你的while循环结束后。这种尚未消耗的输入将被消耗(在其他方面 单词将作为输入提供给您的菜单选项&#34; scanf&#34; (可以选择下一个动作)。这就是光标没有等待您为菜单选择提供输入的原因
您也可以按照之前的答案(I am not able to flush stdin)强制清除stdin缓冲区 调用您的菜单功能,以便它等待您的输入选择
答案 1 :(得分:0)
我没有看到您的功能出现任何严重错误,但您的终止标准似乎已被一个人拒之门外。如果在现在测试的地方进行测试,那么真的是两个。想想max
为0或1时会发生什么。
为了适应max
为0的可能性,您需要在每次循环迭代的最开始时(正确地)测试终止条件,然后再读取任何。
另外,我更倾向于测试不等式而不是等式,因为当我的索引有点错误时,这会更好地控制不当行为。所以在这种情况下,我会在counter >= max
时中断或仅在counter < max
时执行迭代。