将float输入到仅处理int的程序中

Jig*_*uff 5 c floating-point double int

我有一个程序,但是只要程序要求输入时我输入浮点数,程序就会突然跳过一个步骤并移至最终输出。该程序如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int a,b,c;
  int i;

  printf("Please enter a number: ");
  scanf("%d", &a);
  printf("Please enter a number: ");
  scanf("%d", &b);

  c = 0; 
  for(i=0; i < b; i++)
    {
    c = c + a;
    } 

  printf("%d x %d = %d\n", a, b, c);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我为输入int a和为float时b,如果for的小数点后的数字b被截断,则程序将按预期输出乘积。但是,当我输入的浮点数时a,程序不会采用第二个数字的值b,而是跳过该步骤并输出的整数版本a x -858993460 = 0

例如:

a =整数,b =浮点数

请输入数字:3
请输入数字:5.6
3 x 5 = 15

a =浮动,b =跳过

请输入数字3.9
请输入数字:3 x -858993460 = 0

代码中的所有缺陷都是有意为之的,但是我只是想知道为什么它会像我上面解释的那样运行。我知道这是因为尝试将浮点数输入有符号整数,但我不确定是什么原因导致它跳过第二个整数scanf("%d", &b)。谁能解释为什么会这样?

谢谢。

Jon*_*ood 3

看起来scanf()在第二种情况下正在读取“3”,而忽略“9”。

然后,当调用第二个时scanf(),输入缓冲区中已经有文本(“.9”)。

我无法准确说出它对“.9”的作用。它可能已经找到了该点,然后因 b 未初始化而中止。通过使用调试器单步执行来确定正在发生的情况应该是一件简单的事情。

但是,基本上,并不是所有的输入都被第一次调用处理scanf(),所以这就是第二次调用试图读取的内容。这就是为什么它不等待您为第二次调用输入任何数据。

  • 我可能会使用“gets()”来读取整行。然后你可以用它做任何你想做的事情,并且它不会弄乱后续的输入值。 (3认同)