【发布时间】:2015-02-27 02:54:25
【问题描述】:
我是 C 的初学者,我遇到了我无法解决的问题,并且无法在此处的其他线程上找到解决方案。
我正在尝试使用以下代码从键盘输入/txt 文件中读取整数:
int grades[MAX_GRADES_LENGTH]={0}, histogram[HISTOGRAM_SIZE]={0};
int maxGradesHistogramBucket=0, median=0, gradesLength=0;
double avg=0.0;
int grade=0;
printf("Enter grades:\n");
while (scanf("%d",&grade) != EOF)
{
grades[gradesLength]=grade;
gradesLength=gradesLength+1;
}
我应该在 Grades[] 数组中设置这些“等级”,并沿循环计算数组的长度。
不知何故循环行为不端,似乎某些输入与循环无关,但对于某些输入(实际上大多数输入),无论是文件的实际结尾,还是终端中的 ^D 命令。
我听说 scanf() 不是最可靠的读取数据的方法,但不幸的是我不能使用其他任何方法,因为我们还没有在课堂上学习任何其他方法,所以我们只能使用 scanf()我们的作业。
我已尝试将!= EOF 更改为== 1,但都一样。
对于输入
100 0 90 10 80 20 70 30 60 40 50
例如,它工作正常。 但对于输入:
0 50 100
循环是无限的。
顺便说一句,我正在使用 macbook pro(如果重要的话)。
有什么想法吗?
【问题讨论】:
-
MAX_GRADES_LENGTH的值是多少? -
请提供完整的例子。
-
在
grades[gradesLength]=grade;之前添加if ([gradesLength >= MAX_GRADES_LENGTH) break;到 while 循环以确保代码不会读取太多。 -
我的控制台上的 EOF 字符是 Ctrl-Z 而不是 Ctrl-D 并且这个发布的代码确实有效(虽然不完美),类似于来自@DirkKoopman 的回答。
-
如果您使用的是 MacBook Pro,EOF 字符是 control-D,除非您有意重新映射它。 Control-Z 暂停正在运行的程序,但这意味着“发送 SIGSTOP”并将其置于暂停状态。 shell再次提示,但程序并没有死。您应该可以通过
jobs看到它——如果您一直在使用 control-Z,您可能会感到惊讶。您可以使用stty -a检查您的字符映射,并查看最后输出的“cchars”部分。在我的 Mac 上,输出包括:cchars: … eof = ^D; … erase = ^?; intr = ^C; … susp = ^Z; ….
标签: c while-loop scanf infinite-loop eof