用户将float放入整数变量

时间:2019-01-22 12:50:01

标签: c

我在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

2 个答案:

答案 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的改进留给读者练习。