当前位置: 首页 > 知识库问答 >
问题:

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

尹赞
2023-03-14

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

eg:

hello world,我是一个返回值为10的函数

现在输入一个值:44.67

所以您输入了值:44

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

有什么帮助吗?

共有2个答案

鄂昌胤
2023-03-14

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

李勇
2023-03-14

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

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

 类似资料:
  • 对于作业,我必须编写以下代码: 当我尝试编译它时,它在命令提示符下给了我3个错误,说“无法解析符号,符号:类扫描仪,位置:类单词,扫描仪用户输入=新扫描仪(System.in)”。我不确定错误在哪里。我应该使用BufferedReader作为输入吗?

  • 问题内容: 我是Java的新手学生,正在尝试完成一个使用扫描仪输入5个学生姓名的程序,然后在其中进行循环以为每个学生获得3个成绩。我一直卡在输入错误匹配错误,我不知道为什么。我试图正确匹配将哪些类型的输入输入到变量中。任何帮助将不胜感激! 这就是我所拥有的: 这就是我得到的: 问题答案: 您的问题在第20行。 这意味着在输入中,它期望一个int值,但它会发现另一件事,例如double,char数组

  • 问题内容: 我正在尝试解决可以在这里找到的SPOJ问题 以下是我的解决方案: 该代码工作正常。这里的问题是在SPOJ中执行超时时会超时。 我最初只是使用,但是随后遇到了这个线程,建议我改用它来进行更快的输入扫描。 但是我仍然遇到超时问题。我只是循环获取所有输入,并且在此循环本身中,我确定输入是否可分割。因此,我认为这不是循环而是输入扫描需要时间。如何改善此功能以更快地读取输入?还是这个问题在其他地

  • 10.2. 标准输入、输出和错误 UNIX 用户已经对标准输入,标准输出和标准错误的概念非常熟悉了。这一节是为其他不熟悉的人准备的。 标准输入和标准错误(通常缩写为 stdout 和 stderr)是內建在每一个 UNIX 系统中的管道。当你 print 某些东西时,结果前往 stdout 管道;当你的程序崩溃并打印出调试信息(类似于 Python 中的错误跟踪)的时候,信息前往 stderr 管

  • 有一点需要注意,光标位于memberid:00888的末尾 到目前为止一切都很好: 当第2次(如下一个人)发生时 但我想它们会触发TextChanged事件 我如何重新聚焦或...清除旧的数字和光标回到txtBox的开始后,之前的滑动完成了它的东西... 我是一个初学者,所以我敢肯定下面的代码是相当垃圾.... 问题:不是所有的条形码都是5位数!!它们是随机长度!!Memeber ID从2位数(如

  • 问题内容: 我有两个Java类,一个包含getter和setter,另一个是驱动程序类。我需要来自驱动程序类中扫描程序的用户输入才能属于第一类中的getter。用户输入必须为double,因为它将用作getter中的公式。 问题答案: 真正最好的是将所有内容都放在一个类中,没有理由将一个类分成两个类,只是为了使获取器和设置器与其他类分开,这 没有任何意义 。我确实想知道您是否误解了您的作业。 现在