在家养病,闲着没事看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,再多则不利用。
VS2019中scanf返回值被忽略的问题及其解决方法
目录 [问题](#昨天在使用Visual Studio 2019编写C语言程序时遇到了scanf返回值被忽略问题) 问题原因 方法① 方法② 方法③ 方法④ 昨天在使用Visual Studio 20 ...
c语言scanf返回值
1. scanf 函数是有返回值的,它的返回值可以分成三种情况 1) 正整数,表示正确输入参数的个数.例如执行 scanf("%d %d", &a, &b); 如果 ...
C语言scanf函数返回值小记
scanf scanf是C标准库stdio里面定义的用于获取用户输入的函数,具体的介绍可以在CppReference上看到.scanf的返回值是已经成功赋值的变量个数,也就是说在 scanf(&quo ...
C语言scanf的返回值
#include int main(void) { long num; long sum = 0L; int status; printf("Please e ...
printf与scanf的返回值、注意点
printf()的返回值为其输出字符串常量的字符数(注意字符数与字数的区别)注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符). scanf()函数返回成功读入的项目的个数 ...
关于scanf的返回值
今天写一个小程序时误用while(scanf("%d",&b)!=a),以为scanf的返回值就是输入的值. 其实真相是: scanf返回接收到的变量值的个数. int a ...
关于scanf函数的返回值问题
如: scanf("%d%d",&a,&b); 1.如果a和b都被成功读入,则scanf的返回值为2 2.如果只有a被成功读入,那么返回值为1 3.如果a和b都未被 ...
scanf和cin的返回值
需要连续从标准输入读取数据时,可以采用下面两种不同的方式判断文件结束: [cpp] view plaincopy int i; while(scanf("%d",&i) ...
scanf printf函数返回值
1. scanf 函数是有返回值的,它的返回值可以分成三种情况 1) 正整数,表示正确输入参数的个数.例如执行 scanf("%d %d", &a, &b); ...
随机推荐
vs2010中如何设置Visual Assist方便地使用现成的代码编辑器风格
风格setting可以在下面网站上获取: http://studiostyl.es/ 在VS2010+VA直接使用会有2个显著的问题: 1,有些符号颜色太深,与黑色背景几乎融为一体: 2,光标落入大小 ...
java 编码
编码和解码:无论是解码还是编码都是针对码表来讲的. 编码:将能看懂得字符变为我们看不懂的码值. 字符串--->字节数组 String类的getBytes() 方法进行编码,将字符串,转为对映的二 ...
Core Data
• Core Data 是 iOS SDK 里的一个很强大的框架,允许程序员 以面向对象 的方式储存和管理数据 .使用 Core Data 框架,程序员可以很轻松有效 地通过面向对象的接口 ...
纯CSS实现圆形进度条
CSS的优点在于的可以随意组合HTML元素来实现许多中效果,这儿我将使用CSS来实现一个运行进度条,效果如下: 思路是用两个div来作为进度条外观,表示进度的div和外面div宽度和高度保持一致,并是 ...
深入解析Oracle 10g中SGA_MAX_SIZE和SGA_TARGET参数的区别和作用
原文链接:http://m.blog.csdn.net/blog/aaron8219/40037005 SGA_MAX_SIZE是从9i以来就有的作为设置SGA大小的一个参数,而SGA_TARGET则 ...
Elasticsearch安装和使用
Elasticsearch安装和使用 Elasticsearch 是开源搜索平台的新成员,实时数据分析的神器,发展迅猛,基于 Lucene.RESTful.分布式.面向云计算设计.实时搜索.全文搜索. ...
uva 348
dp还是比较容易 关键是输出路径 .... #include #include #include #de ...
ECSTORE验证码优化
用ecstore的朋友应该知道,ecstore的验证码超级鸡肋. 特别是字母和数字混合,根本就看不懂写的是什么? 数字还好,但是字母就别提了.而且还小. 索性就把验证码换掉.研究一下发现,ecstor ...
使用JQUERY操作Radio
发展中经常使用Radio为了实现用户的选择的影响.我在该项目中使用的一些JQUERY操作Radio该方法.这里分享,对于有需要的朋友参考的. 1.变化radio选择.引发一些结果 $("in ...
JS深度判断两个对象字段相同
代码: /** * 判断此对象是否是Object类型 * @param {Object} obj */ function isObject(obj){ return Object.prototype. ...