c - 在只处理整数的程序中输入 float

标签 c floating-point int double

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

#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;
}

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

例如:

a = 整数,b = 浮点数

Please enter a number: 3
Please enter a number: 5.6
3 x 5 = 15



a = float ,b = 跳过

Please enter a number 3.9
Please enter a number: 3 x -858993460 = 0



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

谢谢。

最佳答案

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

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

我无法确切地说出它对“.9”做了什么。它可能已经找到了点,并在那里中止了 b 未初始化。通过逐步调试调试器来确定正在发生的事情应该是一件简单的事情。

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

关于c - 在只处理整数的程序中输入 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6922442/

相关文章:

python - 我该如何修复 : 'int' object is not iterable

java - 如何在java中将CSV文件转换为整数数组?

java - Java中的++int是什么?

c++ - 跨 DLL 边界使用 Direct2D

调用函数指针(语法)

c - C 中的 NaN 文字?

c# - 在 C# 中格式化 double 输出

c - fork 的子进程是否使用相同的信号量?

c - 从矩阵读取,用 malloc 分配,AddressSanitizer : heap-buffer-overflow

c++ - C 和 C++ 中双浮点值的表示法