我在Linux Ubuntu上使用gcc
编译器。这是我的问题:我很困惑为什么我的程序会这样做。为什么在放置浮点数时会跳过我的scanf
其余语句。我知道您不想将浮点数放入整数,但是为什么要这样做。它不砍掉小数点,为什么要在变量中放入大数字。有人可以解释一下吗?附言:我知道如何解决它,我只想知道为什么这样做。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
int i = 0;
int gamesPlayed = 0;
int goals[gamesPlayed];
int totalGoals = 0;
float avg = 0;
printf("How many games have you played? ");
scanf(" %d", &gamesPlayed);
for (i=0; i < gamesPlayed; i++)
{
printf("How many goals did you score in game %d? ", i+1);
scanf(" %d", &goals[i]);
totalGoals += goals[i];
printf("%d\n", totalGoals);
}
avg = ((float)totalGoals / gamesPlayed);
printf("Total Goals: %d\n", totalGoals);
printf("Avg: %.2f\n", avg);
return 0;
}
错误:
您玩了几局? 2.6
2.000000
您在第一场比赛中进球了多少个进球? 1863382920
您在第二场比赛中进球了多少个进球? 1863415686
总目标:1863415686
平均:931707840.00
答案 0 :(得分:3)
使用输入 2.6 时,第一个scanf
将读取2,并将 .6 留在输入流中。
下一个scanf
将显示。,该值不能转换为整数。因此,scanf
返回并且goals[i]
未初始化。输入流仍将包含 .6 ,因此在循环中一次又一次地发生完全相同的事情。
然后,您使用未初始化的变量来计算平均值,因此最终得到“奇怪”的值。注意:使用未初始化的变量是未定义的行为。
请注意,该问题与浮动无关。问题很简单,就是输入包含无法转换为整数的字符。像 2HelloWorld6 这样的输入将为您提供相同的结果。
您需要检查scanf
返回的值,例如:
if (scanf(" %d", &goals[i]) != 1)
{
// Ups - could not scan an integer
... add error handling here ...
}
顺便说一句:考虑使用fgets
读取用户输入并使用sscanf
进行扫描。在大多数情况下,这比使用scanf
要容易得多,因为您不会最终陷入输入流中某些字符卡住的情况。
答案 1 :(得分:0)
这个非常简单的程序显示了如何解决该问题:
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
// Read an integer value from the user
// returns false if input stream cannot be read (usually EOF)
// Any non digit characters are discarded:
// Examples:
// "123abc" => 123
// "123.456" => 123
// "" => 0
// "abc" => 0
bool ReadIntFromUser(int *value)
{
char inputbuffer[100];
if (fgets(inputbuffer, sizeof inputbuffer, stdin))
{
*value = (int)strtoul(inputbuffer, NULL, 10);
return true;
}
else
return false;
}
int main(void) {
int x = - 1;
while (ReadIntFromUser(&x))
{
printf("Input was %d\n", x);
}
}
ReadIntFromUser
的改进留给读者练习。