scanf和错误的输入使得输出很奇怪

时间:2015-04-11 08:31:48

标签: c scanf

我在C中有以下代码:

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

int var();
int var()
{
    return 10;
}

void main()
{
    int a;
    double x;
    a=0;
    a=var();
    printf("hello world, i am a function which returned the value %d",a);
    printf("\nnow you enter a value:");
    scanf("%d",&a);

    printf("so you entered the value: %d",a);
    printf("\nnow enter a double value:");
    scanf("%lf",&x);
    printf("The double number till 4 precision is: %0.4lf",x);
}

当我为两个scanf输入正常的整数和双精度值时,它运行正常。但是我想让它更强大。如果我输入int scanf的十进制值,代码将直接跳转到下一个printf并跳过scanf为double。它打印我在int中输入的小数部分作为double值。

例如:

  

你好世界,我是一个返回值10的函数

     

现在输入一个值:44.67

     

所以你输入了值:44

     

现在输入一个双倍   value:直到4精度的双精度数:0.6700

任何帮助?

2 个答案:

答案 0 :(得分:1)

这很棘手,因为带分数的数字(例如12.34)确实有一个有效的整数部分,它被第一个{{1}读取并正确解析打电话。

最简单的解决方案是使用例如fgets将输入读入缓冲区,然后在该缓冲区上使用sscanf

答案 1 :(得分:1)

您应该使用函数fpurge()来清除给定流中缓冲的任何输入或输出(在这种情况下为stdin)。 试试这个:

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

int var();

int main(int argc, char *argv[]) {
  int a;
  double x;

  a = 0;
  a = var();

  printf("Hello world, I am a function which returned the value %d.\n", a);
  printf("Now you enter a value: ");
  scanf("%d", &a);

  printf("So, you entered the value %d.\n", a);
  printf("Now enter a double value: ");
  fpurge(stdin);
  scanf("%lf", &x);
  printf("The double number till 4 precision is %.4lf.\n", x);

  return 0;
} // End main

int var() {
  return 10;
}

这是我得到的输出:

  

Hello world,我是一个返回值10的函数。
现在你   输入值:44.67左右,输入值44.
现在输入   双精度值:3.14159
直到4精度的双精度数   3.1416。