scanf返回值问题

闲着没事看C primer plus,看到书中对于scanf输入的判断,常用如下方法:

此时它将返回1视为我输入成功,如果不为1则视为输入失败。那到底scanf的返回值具体指的是什么呢?

例子1:

void main() 

int a;
int b;
int c;
printf("请输入三个整数:");
int x=scanf("%d%d%d",&a,&b,&c);
printf("%d/n%d/n",a,x);
}

运行结果是:          

如果输入1 2 3, x = 3;

如果输入1 2 g, x = 2;  (g表示我没按照scanf的格式符%d输入,也就是不符合格式符形式的输入)

如果输入1 g g, x = 1;

如果输入g g g, x = 0;

如果输入g 1 1, x = 0;

如果输入1 g 1, x = 1;

据此,得出的结论是,scanf返回的是到第一个错误的输入形式为止(如果没有那就到结尾呗),所有符合格式符的正确输入的个数。

如果这个结论各位明白,那情况下面一行语句,看i结果是多少?

i=scanf("%d%d%d",&a,&b);

运行结果是:同例子1

此例子中格式占位符%d有三个,对应的输入表项有俩。但是运行时依旧被要求输入三个(windows, DevC++)。输入的第三个整数确实没有承接变量,是被放到了缓冲区里面。但当输入是1 2 3三个正确整数时,返回值仍是3。

这就是需要强调的第二点:scanf 函数的返回值反映的是按照指定的格式符正确读入的数据的个数。而不管你输入表项是否齐全。

Ps:有的编译环境以上操作可能存在问题,比如scanf("%d%d%d",&a,&b); 会出现段错误。这有赖于编译器实现。

  所以能理解到的是scanf有可能在不同环境下返回值的情况是不同的,可移植情况是有待考虑的。

  而且C语言编程,怎么能看出一个程序员是老程序员,就是他写的程序是否稳定。他们可能忘记了这些具体的细节(具体返回值表示什么),但是他们始终保持不触碰模棱两可的地方。比如这个scanf返回值最多就是判断是否>0,再多则不利用。

引用:http://blog.csdn.net/linuxxulin/article/details/7018321

时间: 2024-11-07 13:35:54

scanf返回值问题的相关文章

scanf返回值的问题

关于scanf的返回值,MSDN里是这样写的:Both scanf and wscanf return the number of fields successfully convertedand assigned; the return value does not include fields that were read butnot assigned. A return value of 0 indicates that no fields were assigned.The retur

C语言scanf函数返回值小记

scanf scanf是C标准库stdio里面定义的用于获取用户输入的函数,具体的介绍可以在CppReference上看到.scanf的返回值是已经成功赋值的变量个数,也就是说在 scanf("%d %d",&a,&b)这个调用返回的值在用户输入1 2时返回的是2,如果用户输入的是1 b,那么返回值为1,如果输入的是a b,那么返回的是0. 问题 刚刚用了这个例子,发现输入字母时会导致一直无限输出0: #include <stdio.h> int main(

关于scanf的返回值

今天写一个小程序时误用while(scanf("%d",&b)!=a),以为scanf的返回值就是输入的值. 其实真相是: scanf返回接收到的变量值的个数. int a,b,c. a 1进去时,试图用字符'a'对a赋值,肯定是错的,于是退出,返回成功接收到赋值的个数 0. 1 a进去时,首先a能获取1.但b不能获取'a',于是返回只是1 如果是 1 1的话,那就都成功,返回2 即返回值应为正确输入的个数,毕竟人家是输入函数嘛.

scanf,printf函数的返回值

参考自:https://www.douban.com/note/220299804/ scanf函数的返回值有三种情况: (1)第一种就是返回一个正整数,表示输入成功元素的个数. (2)第二种如果返回的值为0,代表输入不匹配,没有正确输入任何值,所以有了下面的代码. (3)第三种返回-1(EOF)也就是输入流结束.Windows:CTRL + Z表示输入结束,Linux:CTRL + D. printf函数的返回值为输出元素的个数.printf("%d\n", 1);  //2 #in

printf与scanf的返回值、注意点

printf()的返回值为其输出字符串常量的字符数(注意字符数与字数的区别)注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符). scanf()函数返回成功读入的项目的个数.即在下面程序中scanf的返回值为1.如果没有读取任何项目(如它期望一个数字但是出入了一个非数字字符),它会返回值0.当它检测到“文件结尾”时,它返回EOF(EOF是文件stdio.h中定义的特殊值.一般,#define 指令把EOF 的值定义为 -1).    int n; float  p; 

scanf和cin的返回值(转)

需要连续从标准输入读取数据时,可以采用下面两种不同的方式判断文件结束: [cpp] view plaincopy intwhile"%d"dowhiledo 首 先看scanf,当成功读取时返回读取的项的数目,如:scanf("%d %d",&i,&j)返回2,scanf("%d %f %s",&i, &f, c)返回3.这个数目可以是你希望读取的项数,也可能小于希望读取的项数,在匹配失败时返回0(如:用scanf

c语言中get()函数的原理及返回值

转载自CSDN博客:http://blog.csdn.net/shenglanya/article/details/52213500 首先要记住的一句话就是Never use gets().这是因为gets()函数不检查目标数组是否能够容纳输入,而若想把一个字符串读到程序中,最先要做的事情就是预留存储字符串的空间.所以这很容易导致分配的空间不够大而数组越界,然而gets()函数并不检查这个方面,所以导致的结果就是程序很容易出现漏洞,著名的"蠕虫"病毒的原理就是用很长的数据覆盖原有数据导

(转)如何编写有多个返回值的C语言函数

1引言    笔者从事C语言教学多年,在教学中学生们常常会问到如何编写具有多个返回值的C语言函数.编写有多个返回值的函数是所有C语言教材里均没有提到的知识点,但在实际教学与应用的过程中我们都有可能会遇到这样的问题.有学生也尝试了不少方法:如把多个需要返回的值作相应的处理后变成一个可以用return语句返回的数据,再在主调函数中拆开返回的数据使之变成几个值:或者把需要返回多个值的一个函数分开几个函数去实现多个值的返回.这些方法虽然最终都能实现返回要求的多个值,但从程序算法的合理性与最优化方面去考虑

使用函数返回值的循环例子

计算数值的整数次幂的例子:实例程序: //power.c--计算数值的整数次幂 #include<stdio.h>  double power (double n,int p);//函数声明 int main(void) {  double x,xpow; int exp; printf("Enter a number and the positive integer power to which\n the number will be raised. Enter q to qui