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 ,但在这种情况下这无济于事,因为scanf
s 都将返回 1。不过,检查这很好......
输入44.67
时,第一个scanf
消耗44
。第二个scanf
看到.67
并使用它,因为它是一个有效的十进制数。这就是为什么第二个 scanf
被“跳过”
也许需要更好的 scanf 模式
总是检查scanf
的返回值,例如:if (scanf("%d", &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输出多种类型的变量,下面是我写的例题