printf与scanf函数的返回值

简介: printf与scanf函数的返回值

引言


 由一道题引发对这两个C语言中常见函数返回值的思考与探索


 请看题,思考输出的结果是什么?


#include<stdio.h>
int main()
{
  printf("%d", printf("%d", printf("%d", 43)));
  return 0;
}

 可能很多小伙伴第一次看到这题时懵了,“什么,printf函数还有返回值?”,包括我也不例外。但是C语言中不仅有规定其返回值,而且表明了它的特殊用途。


printf函数


 先来看看函数声明


int printf( const char *format [, argument]... );

 返回值为int,即为整型


 那么,它代表了什么呢?


Return Value


Each of these functions returns the number of characters printed, or a negative value if an error occurs.


 这是MSDN里给出的解释,中文意思是返回打印的字符数,如果发生错误则返回负值


 举个例子:


int ret = printf("%d", 2023);

 那么如果代码是这样,因为2023占据4个字符,返回值则为4


 此时,你是不是能够回答开头的问题啦?


#include<stdio.h>
int main()
{
  printf("%d", printf("%d", printf("%d", 43)));
  return 0;
}

  没错,输出是4321。来,请再跟我分析一遍,首先打印43,43占据2个字符,所以返回2。接下来,打印2,而2占据1个字符,所以返回1。最后,打印1。所以,屏幕上输出结果就是4321。


 此时,你是不是已经基本掌握它的用法啦?再来看看这道变式题:


#include<stdio.h>
int main()
{
  printf("%d", printf("%d ", printf("%d ", 43)));
  return 0;
}

 有没有发现什么变化,没错,在每次打印时后面加上空格,打印的结果还是4321吗?(请自行思考)


scanf函数


 有了printf函数,那么怎么能少了scanf函数这个好基友呢?那我们再探讨一下scanf函数的返回值与用法吧。


 先来看看函数声明

int scanf( const char *format [,argument]... );

 返回值同样为int ,那么它有代表了什么意思呢?


 在MSDN中查询得知


Return Value


scanf  return the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned.


A return value of 0 indicates that no fields were assigned.


The return value is EOF for an error or if the end-of-file character or the end-of-string character is encountered in the first attempt to read a character.


 是不是看得有点头晕,哈哈没事,简单翻译一下就是返回成功转换和分配的字段数,


 返回值为0表示没有分配字段。


 返回值为EOF表示发生错误,或者第一次读取到字符串或者文件末尾


举个例子:


int main()
{
  int ch = 0;
  int ret = scanf(&ch);
  printf("%d\n", ret);
  return 0;
}

  此时没有为ch分配字段,也就是占位符,所以返回值为0


int main()
{
  int ch1 = 0;
  int ch2 = 0;
  int ret = scanf("%d%d", &ch1, &ch2);
  printf("%d\n", ret);
  return 0;
}

 此时成功分配了2个字段,所以返回值就为2


 但是,要注意以下情况:


int main()
{
  int ch1 = 0;
  int ch2 = 0;
  int ret = scanf("%d%d", &ch1);
  printf("%d\n", ret);
  return 0;
}

 这种还有字段未分配的情况,是标准中未定义的,所以会报错



 那么,说了这么多,它有什么具体用途呢?


if (scanf("%d%d", &a, &b) == 2)
  {
  //语句
  }

 1.它可以用来判断是不是输入的参数都成功转换并分配字段,保证参数的有效性


while (scanf("%d%d", &a, &b) != EOF)
{
  //语句
}

 2.它可以用来多组输入,只要没有读取到文件末尾,就一直循环输入 (这个方式特别是在网站刷  题的时候,经常会用到)


总结


读完这篇文章,你是不是对于常用的printf和scanf有更深入的了解呢?各位小伙伴在学习的过程中,也要多去思考和举一反三,以及善用比如MSDN这样方便好用的工具,来提高自己的学习效率。最后,思考题的答案放在评论区哦~

相关文章
|
缓存 Kubernetes 数据安全/隐私保护
k8s1.18多master节点高可用集群安装-超详细中文官方文档
k8s1.18多master节点高可用集群安装-超详细中文官方文档
|
Ubuntu 网络协议 Java
【Android平板编程】远程Ubuntu服务器code-server编程写代码
【Android平板编程】远程Ubuntu服务器code-server编程写代码
|
XML Android开发 数据格式
IDEA代码格式和JavaDoc设置,一键告别丑陋代码
IDEA代码格式和JavaDoc设置,一键告别丑陋代码
2263 1
IDEA代码格式和JavaDoc设置,一键告别丑陋代码
|
Ubuntu Linux 程序员
无需编码5分钟免费部署云上调用满血版DeepSeek
大家好,我是V哥。本文介绍如何部署DeepSeek满血版,包括本地和云上两种方式。本地部署需准备Ubuntu/CentOS环境、硬件要求及Docker等工具,适合开发者;云上部署则推荐使用阿里云方案,最快5分钟、0元即可完成,提供100万免费token,无需编码,操作简便。选择适合自己的方式,体验高性能的DeepSeek模型吧!关注V哥,做个高效程序员。
1410 8
无需编码5分钟免费部署云上调用满血版DeepSeek
|
10月前
|
人工智能 开发者
AI-Compass宝藏资源库:构建最全面的AI学习
AI-Compass宝藏资源库:构建最全面的AI学习
|
JavaScript
如何解决ElementUI中的el-tab-pane组件使用v-show不生效的问题?
如何解决ElementUI中的el-tab-pane组件使用v-show不生效的问题?
1511 3
|
开发框架 .NET 程序员
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
Autofac 是一个轻量级的依赖注入框架,专门为 .NET 应用程序量身定做,它就像是你代码中的 "魔法师",用它来管理对象的生命周期,让你的代码更加模块化、易于测试和维护
688 4
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
|
文字识别 自然语言处理 数据可视化
Qwen2.5 全链路模型体验、下载、推理、微调、部署实战!
在 Qwen2 发布后的过去三个月里,许多开发者基于 Qwen2 语言模型构建了新的模型,并提供了宝贵的反馈。在这段时间里,通义千问团队专注于创建更智能、更博学的语言模型。今天,Qwen 家族的最新成员:Qwen2.5系列正式开源
Qwen2.5 全链路模型体验、下载、推理、微调、部署实战!
|
Arthas 监控 数据可视化
JVM进阶调优系列(7)JVM调优监控必备命令、工具集合|实用干货
本文介绍了JVM调优监控命令及其应用,包括JDK自带工具如jps、jinfo、jstat、jstack、jmap、jhat等,以及第三方工具如Arthas、GCeasy、MAT、GCViewer等。通过这些工具,可以有效监控和优化JVM性能,解决内存泄漏、线程死锁等问题,提高系统稳定性。文章还提供了详细的命令示例和应用场景,帮助读者更好地理解和使用这些工具。
|
Python
python国内原地址
【7月更文挑战第2天】 国内Python用户为加速包安装常使用镜像源,
5527 1