C 将浮点输入到只处理整数的程序中

C 将浮点输入到只处理整数的程序中,c,floating-point,int,double,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", &

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

#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;
}
#包括
#包括
int main()
{
INTA、b、c;
int i;
printf(“请输入一个数字:”);
scanf(“%d”和“&a”);
printf(“请输入一个数字:”);
scanf(“%d”和“b”);
c=0;
对于(i=0;i
当我为
a
输入一个int,为
b
输入一个float时,如果
b
的小数点后的数字被截断,程序将按预期输出产品。但是,当我为
a
输入一个浮点值时,程序不会获取第二个数字
b
的值,而是跳过该步骤并输出整数版本的
a x-858993460=0

例如:

a=int,b=float

请输入一个数字:3
请输入一个数字:5.6
3x5=15

a=浮动,b=跳过

请输入数字3.9
请输入一个数字:3X-858993460=0

代码中的所有缺陷都是故意的,但我只是想知道为什么它会以我上面解释的方式运行。我知道这是因为试图将浮点输入到有符号整数中,但我不确定究竟是什么原因导致它跳过第二个
scanf(“%d”,&b)
。有人能解释为什么会这样吗

谢谢。

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

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

我不知道它到底在用“.9”做什么。它可能已经找到了点,只是在b未初始化的情况下中止了。通过使用调试器来确定正在发生的事情应该很简单

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

控制台输入是行缓冲的;当您在
%d
格式说明符中输入3.9时,仅使用3,其余数据保持缓冲状态,因此第二个scanf()调用尝试根据其说明符对其进行转换,它会找到一个
'。
并中止转换,而保留未定义的b

scanf()
将继续“下降”,直到输入数据末尾的
'\n'
被消耗。您可以这样做:

  printf("Please enter a number: ");
  scanf("%d", &a);
  while( getchar() != '\n' ) { /* do nothing */ }

  printf("Please enter a number: ");
  scanf("%d", &b);
  while( getchar() != '\n' ) { /* do nothing */ }
请注意,如果格式说明符是
%c
,则需要修改“flush”代码,因为转换的字符可能已经是
'\n'

scanf("%c", &c);
while( c != '\n' && getchar() != '\n' ) { /* do nothing */ }

如果要读取的下一个字符无法按照格式说明符指定的当前格式转换,
scanf
停止扫描和存储当前字段,并移动到下一个输入字段(如果有)

该特定字符被视为未读字符,并用作下一个输入字段或任何后续读取操作的第一个字符

在上面给出的示例中,它正在扫描
3
,然后无法将
解析为格式说明符
“%d”
。因此,它将
3
存储在变量
a
中,将
.9
保留为未读。当控件传递到下一个
scanf
语句时,它将扫描
,但由于它无法将
解析为格式说明符
%d”
,它将跳过该字段的输入扫描


现在由于变量
b
未赋值,它包含一些垃圾值。任何带有垃圾值的算术运算都会产生垃圾值。

相关线程:我们如何刷新/清空缓冲区?我可能会使用
gets()
读取整行。然后,您可以对它执行任何操作,它不会打乱后续的输入值。scanf()遇到与格式说明符不匹配的字符时的行为是中止转换并返回,其余未成功的转换使变量保持不变,在这种情况下,它未初始化。所以你可以“准确地说”,因为它定义得很好。