在家养病,闲着没事看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,再多则不利用。

scanf返回值问题的更多相关文章

  1. VS2019中scanf返回值被忽略的问题及其解决方法

    目录 [问题](#昨天在使用Visual Studio 2019编写C语言程序时遇到了scanf返回值被忽略问题) 问题原因 方法① 方法② 方法③ 方法④ 昨天在使用Visual Studio 20 ...

  2. c语言scanf返回值

    1. scanf 函数是有返回值的,它的返回值可以分成三种情况 1) 正整数,表示正确输入参数的个数.例如执行 scanf("%d %d", &a, &b); 如果 ...

  3. C语言scanf函数返回值小记

    scanf scanf是C标准库stdio里面定义的用于获取用户输入的函数,具体的介绍可以在CppReference上看到.scanf的返回值是已经成功赋值的变量个数,也就是说在 scanf(&quo ...

  4. C语言scanf的返回值

    #include <stdio.h> int main(void) { long num; long sum = 0L; int status; printf("Please e ...

  5. printf与scanf的返回值、注意点

    printf()的返回值为其输出字符串常量的字符数(注意字符数与字数的区别)注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符). scanf()函数返回成功读入的项目的个数 ...

  6. 关于scanf的返回值

    今天写一个小程序时误用while(scanf("%d",&b)!=a),以为scanf的返回值就是输入的值. 其实真相是: scanf返回接收到的变量值的个数. int a ...

  7. 关于scanf函数的返回值问题

    如: scanf("%d%d",&a,&b); 1.如果a和b都被成功读入,则scanf的返回值为2 2.如果只有a被成功读入,那么返回值为1 3.如果a和b都未被 ...

  8. scanf和cin的返回值

    需要连续从标准输入读取数据时,可以采用下面两种不同的方式判断文件结束: [cpp] view plaincopy   int i; while(scanf("%d",&i) ...

  9. scanf printf函数返回值

    1. scanf 函数是有返回值的,它的返回值可以分成三种情况  1) 正整数,表示正确输入参数的个数.例如执行 scanf("%d %d", &a, &b);   ...

随机推荐

  1. Asp.net MVC 如何对所有用户输入的字符串字段做Trim处理

    经常需要对用户输入的数据在插入数据库或者判断之前做Trim处理,针对每个ViewModel的字段各自做处理是我们一般的想法.最近调查发现其实也可以一次性实现的. MVC4.6中实现方式 1,实现IMo ...

  2. HttpWebRequest操作已超时

    最近我们使用.NET3.5HttpWebRequest会报操作已超时但使用.NET4.0版本及以上却可以正常访问. 一段简单的代码如下: string returnData = "" ...

  3. A. Karen and Morning

    A. Karen and Morning time limit per test 2 seconds  memory limit per test 512 megabytes input standa ...

  4. 导出CSV表格数据

    <?php class Csv{ //导出csv文件 public function put_csv($list,$title){ $file_name="CSV".date ...

  5. if和for的几个经典题目

    1.有一对幼兔,幼兔1个月后长成小兔,小兔1个月后长成成兔并生下一对幼兔,问几年后有多少对兔子,幼兔.小兔.成兔对数分别是多少. 幼兔 1 小兔 0 成兔 0幼兔 0 小兔 1 成兔 0 幼兔 1 小 ...

  6. C#注册表操作类--完整优化版

    using System; using System.Collections.Generic; using System.Text; using Microsoft.Win32; namespace ...

  7. Android studio出现Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Reques的解决办法

    最近更新了一下Android Studio,在导入新项目之后出现Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 4 ...

  8. 二、Solr单机版的搭建

    1.1. 运行环境 solr 需要运行在一个Servlet容器中,Solr4.10.3要求jdk使用1.7以上,Solr默认提供Jetty(java写的Servlet容器),本次使用Tocmat作为S ...

  9. Newtonsoft.Json输出JSON 时动态忽略属性

    一,前言 最近做项目采用Json形式和其他客户端交互,借助于Newtonsoft.Json . 由于业务场景不同,输出的Json内容也不同.要想忽略的属性,可以借助Newtonsoft.Json的特性 ...

  10. 如何在docker配置asp.net core https协议

    本文参考自<Step by step: Expose ASP.NET Core over HTTPS with Docker> 自从微软发布.net core以来,就在许多社区掀起了讨论, ...