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

Posted

技术标签:

【中文标题】scanf 和错误的输入使输出变得奇怪【英文标题】:scanf and wrong input makes output wierd 【发布时间】:2015-06-17 00:29:53 【问题描述】:

我在 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 中输入的小数部分打印为双精度值。

例如:

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

现在您输入一个值:44.67

所以你输入了值:44

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

有什么帮助吗?

【问题讨论】:

阅读 scanf 的手册页 - 它返回一个值! @EdHeal ,但在这种情况下这无济于事,因为scanfs 都将返回 1。不过,检查这很好...... 输入44.67时,第一个scanf消耗44。第二个scanf 看到.67 并使用它,因为它是一个有效的十进制数。这就是为什么第二个 scanf 被“跳过” 也许需要更好的 scanf 模式 总是检查scanf的返回值,例如:if (scanf("%d", &amp;a) != 1) /* error */; 【参考方案1】:

这很棘手,因为带有分数的数字(例如12.34)确实有一个有效的整数部分,第一个scanf调用会读取并正确解析它。

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

【讨论】:

【参考方案2】:

您应该使用函数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;

这是我得到的输出:

你好世界,我是一个返回值 10 的函数。 现在你 输入值:44.67 所以,您输入了值 44。 现在输入 双精度值:3.14159 直到 4 精度的双精度数是 3.1416.

【讨论】:

谢谢您的回复。有效。但还有一个问题。当我使用 fflush(stdin) 时,它没有给我想要的输出,但 fpurge 有?为什么?? @Magnum 不要使用 fflush(stdin)。在此处阅读更多信息cprogramming.com/faq/cgi-bin/…

以上是关于scanf 和错误的输入使输出变得奇怪的主要内容,如果未能解决你的问题,请参考以下文章

关于scanf的输出问题,有高手请教一下如何用scanf输出多种类型的变量,下面是我写的例题

编程之旅——编程常出现的错误(警醒)

如何修复if语句错误和“未指定字符串文字的比较结果”?

标准输入流输出流错误流

c语言编写程序,使输入的字符按字母表后移一位。 如:输入s,输出t; 输入S,输出为T。

scanf 调用时出现“无法打开输出文件”错误