C语言中printf和scanf

前言

本篇文章介绍C语言中的printfscanf函数,之前在C语言中printf打印转换指令详解文章中详细讲解了转换指令,本篇文章介绍几个上篇文章没涉及到的点和其余的注意事项

%g和%G

这两个转换说明符的官方解释是根据值的不同,自动选择%e或者%f(当然,%G对应的是%E),%e或者%E格式用于指数小于-4或者大于等于精度时,先说明一下两个定义:

  • 指数计数法:也叫E计数法,是将一个数字表示为一个介于1到10之间的小数(基数)与一个表示幂次的整数(指数)的乘积。指数可以是正数、负数或零
  • 精度:浮点数的精度是指C标准规定的浮点数必须能精确表示的小数点后有效数字的位数,float一般是6位,double一般是10位

我们写一个例子测试一下:

#include <stdio.h>
int main()
{float a1 = 123456;float a2 = 1234567;float a3 = 0.0001;float a4 = 0.00001;printf("指数为5: %g\n",a1);printf("指数为6: %g\n",a2);printf("指数为-4: %g\n",a3);printf("指数为-5: %g\n",a4);return 0;
}

结果如下:

指数为5: 123456
指数为6: 1.23457e+06
指数为-4: 0.0001
指数为-5: 1e-05

所以可以看出** e < − 4 e<-4 e<4或者 e ≥ 6 e\ge6 e6时会使用%e或者%E,否则使用%f**

printf的返回值

这个功能用的比较少,稍微介绍一下,printf返回打印字符的数目,如果输出过程中出现错误,返回一个负数,经过我测试,中文不止占用一个字符数目,这个应该跟编码规范有关,其实应该取得字符编码所占用字节的数目更恰当一些

printf打印长字符串

如果一个字符串太长,我们想换行打印,有没有什么办法呢?有四种办法:

  1. 一个printf打印分成多个printf,这会进行多次函数调用
  2. 逗号后面断行,但是不能在第一个参数的字符串里边直接断行,很多情况是第一个参数字符串很长,所以实用性差
#include <stdio.h>
int main()
{float a1 = 123456;printf("1111111111222222222333333333: %g\n",a1);return 0;
}
  1. 如果想在字符串里边断行,断行的地方添加反斜杠\,但是之后的新行自动在最左侧对齐,不能进行缩进,因为一缩进就变成了字符串的一部分编码不美观,尤其是在嵌套的块里边使用这种方法
#include <stdio.h>
int main()
{float a1 = 123456;printf("1111111111222222\
222333333333: %g\n",a1);return 0;
}
  1. 把字符串分成多个字符串,两边用"括起来,这样就可以随便换行了,我觉得这是最好的方法
#include <stdio.h>
int main()
{float a1 = 123456;printf("1111111111222222""222333333333: %g\n",a1);return 0;
}

printf中使用*

printf中有一种形如a.b的修饰符,a可能表示字符的宽度,b可能表示浮点数的小数位数,或者表示字符串的最小显示宽度等,这个a和b我们可以使用变量指定,只需要在使用修饰符的时候用*代替即可,看下面例子:

#include <stdio.h>
int main()
{float a1 = 12.354;int fw = 12;int nw = 2;printf("a1: %*.*f\n",fw,nw,a1);return 0;
}

输出

a1:        12.35

scanf的使用规则

scanf和printf一样,也是使用转换说明符来进行读取输入的,scanf的读取规则如下:

  1. 如果读取%c,scanf读取一个字符就返回
  2. 否则,scanf会从跳过前面所有的空白字符,从第一个非空白字符开始读取,根据类型的不同会识别不同的字符,直到遇到无法解析的字符或者已经达到设置的最大宽度或者遇到空白字符
  3. 因为遇到空白符就会停止,所以使用scanf读取字符串的时候只会读取一个单词
  4. 如果使用scanf向字符数组读取字符串,会在读取结束后添加一个\0

scanf格式字符串中的普通字符

scanf函数允许把普通字符放进格式字符串中,除空格字符外的普通字符必须与输入字符串严格匹配,空格字符的话就会跳过前面所有的空格,包括没有空格的情况,看一个例子

#include <stdio.h>
int main()
{float a1 = 0;char c1 = ' ';scanf("%f ,haha, heihei, %c",&a1,&c1);printf("a1: %f\n",a1);printf("c1: %c\n",c1);return 0;
}

输入

12   ,haha,         			heihei,a

运行结果

a1: 12.000000
c1: a

解析输入过程如下:

  1. 首先从一个非空字符开始检测float输入,检测到12
  2. 因为%f后面是一个空格,所以跳过输入的所有空格,虽然我在12后面输入了三个空格,都会跳过
  3. 匹配,haha,,这个必须只能是这样的,否则输入就结束了
  4. 后面又是一个空格,所以跳过输入的所有空格,虽然我在,haha,后面输入了一堆空格,都会跳过
  5. 匹配heihei,,这个必须只能是这样的,否则输入就结束了
  6. 后面又是一个空格,所以跳过输入的所有空格,虽然我没有输入空格
  7. 检测到字符a,赋值给c1
  8. 检测到换行符,输入结束

scanf的返回值

scanf返回成功读取的项数,如果没有读取到任何项,比如需要读取一个数字,你却输入一个字符串,这种会返回0,当scanf检测到文件结尾,会返回EOF

scanf中使用*

scanf中的*和printf不同,把\*放在%和转换符之间,会跳过相应的输入项,看下面的例子

#include <stdio.h>
int main()
{float a1 = 0;int a2 = 0;int a3 = 0;scanf("%*f, %*d, %d",&a3);printf("a1:%f\n",a1);printf("a2:%d\n",a2);printf("a3:%d\n",a3);return 0;
}

输入

12,12,12

运行结果

a1:0.000000
a2:0
a3:12

可以看出,输入跳过了前两个值,只给第三个值赋值了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/200082.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL语句常用语法(开发场景中)

一、SQL语句常用小场景 1.查询某个表信息&#xff0c;表中某些字段为数据字典需要进行转义 SELECTt.ID,CASEWHEN t.DINING_TYPE 1 THEN早餐WHEN t.DINING_TYPE 2 THEN午餐WHEN t.DINING_TYPE 3 THEN晚餐END AS diningTypeStr from student t 2.联表查询语法 select si.*…

挂耳式蓝牙耳机哪个好、性价比高的挂耳蓝牙耳机

近年来&#xff0c;开放式耳机呈现出火热的势头&#xff0c;相较传统的入耳式耳机&#xff0c;长久佩戴也不会有异物般的不适感&#xff0c;通常采用的耳挂式佩戴设计&#xff0c;不需要把耳机放进耳道里也能听见声音&#xff0c;全新的佩戴方式也更为舒适&#xff0c;能维护耳…

01.项目简介

开源数字货币交易所&#xff0c;基于Java开发的货币交易所 | BTC交易所 | ETH交易所 | 数字货币交易所 | 交易平台 | 撮合交易引擎。本项目基于SpringCloudAlibaba微服务开发&#xff0c;可用来搭建和二次开发数字货币交易所。 项目特色&#xff1a; 基于内存撮合引擎&#xf…

Navicat在分辨率不同的屏幕窗口显示大小不一致问题解决

1.主屏幕为2560*1600分辨率&#xff0c;能够显示较多数据连接 2.在第二屏幕分辨率低&#xff0c;字体变大&#xff0c;显示内容变少 解决办法&#xff1a; 1.右击navicat图标-属性 2.选择【兼容性】-在兼容性页面中选择**“更改高DPI设置”** 3…勾选“高DPI缩放替代”&a…

minio配置监听(对象操作日志)

minio配置监听对象操作 本文档适用于minio2021.3.17版本 有时我们需要查看minio中对象操作的日志&#xff0c;比如像监听minio某一个桶中的删除事件&#xff0c;就需要配置监听。minio支持将监听的结果输出到es、pg、amq等等&#xff0c;下面介绍一下将minio对象操作监听结果输…

使用异或查找数组中出现奇数次的唯一或唯二数字

题目&#xff1a; 1.查找数组中的所有出现奇数次的数字&#xff0c;要求数组中不能有负数 2.现在有个数组&#xff0c;假设这个数组中出现奇数次的数字有且只有1个&#xff0c;请把它找出来 3.现在有个数组&#xff0c;假设这个数组中出现奇数次的数字有且只有2个&#xff0c…

【算法思考记录】力扣2477. 到达首都的最少油耗【JavaScript,深度优先搜索】

原题链接 到达首都的最少油耗&#xff1a;一种优雅的解决方案 题目解析 这个算法题目描述了一个有趣的场景&#xff1a;一棵由城市和道路组成的树形结构&#xff0c;其中每个节点代表一个城市&#xff0c;边代表道路。所有城市的代表需要前往编号为0的城市——首都参加会议。…

一個Tensor的一生 - torch.rand篇

一個Tensor的一生 - torch.rand篇 前言torch/\_C/_VariableFunctions.pyibacktracePython bindingstorch::autograd::THPVariable_randoperator() C APItorch::rand_symintat::rand_symint dispatchat::_ops::randat::_ops::rand::callnative_functions.yamlat::(anonymous nam…

【人体解剖学与组织胚胎学】练习一高度相联知识点整理及对应习题

文章目录 [toc]骨性鼻旁窦填空题问答题 关节填空题简答题 胸廓填空题简答题![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/827e7d1db3af42858d8734bb81911fea.jpeg)补充 骨性鼻旁窦 填空题 问答题 关节 填空题 简答题 胸廓 填空题 简答题 补充 第二肋对应胸骨…

Leetcode.2477 到达首都的最少油耗

题目链接 Leetcode.2477 到达首都的最少油耗 rating : 2012 题目描述 给你一棵 n n n 个节点的树&#xff08;一个无向、连通、无环图&#xff09;&#xff0c;每个节点表示一个城市&#xff0c;编号从 0 0 0 到 n − 1 n - 1 n−1 &#xff0c;且恰好有 n − 1 n - 1 n−…

什么是呼叫中心的语音通道?呼叫中心语音线路有几种?

什么是呼叫中心的语音通道&#xff1f; 呼叫中心的语音通道是指在呼叫中心中使用的语音信号传输通道&#xff0c;它是呼叫中心中至关重要的一部分&#xff0c;负责将客户的语音信息传递给客服代表&#xff0c;以及将客服代表的语音信息传递给客户。在呼叫中心的运营中&#xf…

JAVA-JVM 之Class字节码文件的组成 【下篇】

字节码 类元数据接口元数据字段元数据方法元数据属性元数据 主页传送门&#xff1a;&#x1f4c0; 传送 类元数据 此部分元数据主要包含类索引&#xff08;This_Class&#xff09;和父类索引&#xff08;Super_Class&#xff09;。 类索引&#xff1a;指向Class字节码常量池表…

回顾一下磁盘管理

目录 一、磁盘概述 1.磁盘表示方法/dev/ 2.分区类型 3.文件系统 4.inode节点 二、磁盘操作 1.查看与添加磁盘 2.分区 2.非交互式 3.fdisk /dev/sdb < part.txt 三、LVM逻辑卷 1、物理卷中的操作命令 2、卷组中的操作命令 3、逻辑卷中的操作命令 一、磁盘概述 …

Python----Pandas

目录 Series属性 DataFrame的属性 Pandas的CSV文件 Pandas数据处理 Pandas的主要数据结构是Series&#xff08;一维数据&#xff09;与DataFrame&#xff08;二维数据&#xff09; Series属性 Series的属性如下&#xff1a; 属性描述pandas.Series(data,index,dtype,nam…

mybatis 的快速入门以及基于spring boot整合mybatis

MyBatis基础 MyBatis是一款非常优秀的持久层框架&#xff0c;用于简化JDBC的开发 准备工作&#xff1a; 1&#xff0c;创建sprong boot工程&#xff0c;引入mybatis相关依赖2&#xff0c;准备数据库表User&#xff0c;实体类User3&#xff0c; 配置MyBatis&#xff08;在applic…

2005-2021年地级市绿色发展注意力数据(根据政府报告文本词频统计)

2005-2021年地级市绿色发展注意力数据&#xff08;根据政府报告文本词频统计&#xff09; 1、时间&#xff1a;2005-2021年 2、指标&#xff1a;省、市、年份、一级指标、关键词、关键词词频、总词频 3、范围&#xff1a;270个地级市 4、来源&#xff1a;地级市政府工作报告…

【C++】动态内存管理——new和delete

这篇文章我们讲一下C的动态内存管理&#xff0c;从一个比较陌生的知识说起&#xff0c;我们知道&#xff0c;一个工程可以创建很多.c文件&#xff0c;我们如果定义一个全局变量&#xff0c;只要用extern声明一下&#xff0c;在每个文件都可以用。而用static修饰的全局变量只能在…

MyBatis动态sql语句

1、if if元素可以用于根据条件判断是否包含某个SQL语句片段。 <!--查询年龄大于18岁且小于等于30岁的用户信息:<if>元素用于判断minAge和maxAge是否为null&#xff0c;如果不为null&#xff0c;则将对应的SQL语句片段拼接到最终的SQL语句中 --> <select id&quo…

【ecology】通过F12抓取页面SQL

1、点击流程监控&#xff0c;打开浏览器的”开发者工具“&#xff08;F12&#xff09;&#xff1b; 2、点击搜索&#xff0c;在开发者工具中找到sessionkey&#xff0c;复制后面的值。 3、http://58.213.83.186:8081/api/ec/dev/table/getxml?dataKey 上面的网址的IP地址修改…

Gee教程6.模板(HTML Template)

这一章节的内容是介绍 Web 框架如何支持服务端渲染的场景 实现静态资源服务(Static Resource)。支持HTML模板渲染。 这一章节很多内容是基于net/http库的&#xff0c;该库已经实现了很多静态文件和HMML模板的相关功能的了。 静态文件 网页的三剑客&#xff0c;JavaScript、C…