文章目录

  • 1 printf()
    • 1.1 整型
    • 1.2 字符型
    • 1.3 浮点型
    • 1.4 其他
      • 1.4.1 标志
      • 1.4.2 输出最小宽度
      • 1.4.3 精度
      • 1.4.4 类型长度
    • 1.5 转义字符
  • 2 scanf()
    • 2.1scanf( )函数的一般形式
    • 2.2 基本规则和注意事项
  • 3 字符数据的输入输出
    • 3.1 字符输出函数putchar( )
    • 3.2 字符输入函数getchar( )

1 printf()

参考C printf() 详解之终极无惑
printf(“格式化字符串”, 输出表列)

  • 格式化字符串包含三种对象,分别为:

    • 字符串常量;
    • 格式控制字符串;
    • 转义字符。

字符串常量原样输出,在示中起提示作用。输出表列中给出了各个输出项,要求格式控制字符串和各输出项在数量和类型上应该一一对应。其中格式控制字符串是以 % 开头的字符串,在 % 后面跟有各种格式控制符,以说明输出数据的类型、宽度、精度等。

  • 格式控制字符串

    • %[flags][width][.prec][length]type
    • %[标志][最小宽度][.精度][类型长度]类型。
    • 主要介绍类型,类型是必不可少的

1.1 整型

  • d格式字符输出一个有符号的十进制32bits整数
#include <stdio.h>int main()
{int a = 34, b = -123;printf("%d\n%d\n",a,b);      //不指定域宽输出整型变量     printf("%5d\n%5d\n",a,b);      //指定域宽输出整型变量     printf("%5d\n%5d\n",34,-123);  //指定域宽输出整型常量return 0;
}
  • 运行结果
34
-12334-12334-123
  • o格式符:以无符号八进制整数形式输出(不输出前导符号0)

    • e.g. int a=-1;
      printf(“%d,%o”,a,a);
      输出为: -1,37777777777
    • e.g. printf(“%13o”,a);
      输出为: (空两格)37777777777
  • x\X格式符:以无符号十六进制数形式输出整数,x对应的是abcdef,X对应的是ABCDEF(不输出前导符号0x)
    • e.g.int a=-1;
      printf(“%x,%o,%d”,a,a,a);
      输出结果为: ffffffff,37777777777,-1
    • e.g.printf(“0x%x 0x%X”,123,123);输出0x7b 0x7B
  • u格式符:用来输出无符号十进制整型数据。

1.2 字符型

  • c格式字符:用于输出一个字符。输出时,也可指定域宽

    • 可以把输入的数字按照ASCII码相应转换为对应的字符
    • printf(“%c\n”,64)输出A
  • s格式字符: 用于输出一个字符串

1.3 浮点型

  • f格式字符

    • %f 不指定数据宽度和精度,整数部分全部输出,小数部分保留6位。(包括float型和double型)
    • 单精度浮点数用f,双精度浮点数用lf(printf可混用,但scanf不能混用)

    e.g. 用%f格式输出浮点数。
    printf(“ %f\n”, 1.0/3);
    【运行结果】
    0.333333

    • %m.nf 整体(不是整数)输出m位,其中小数部分输出n位。
    • m指定最小宽度,n为精度

    e.g.
    printf(“ %20.15f\n”, 2.0/3);
    【运行结果】(空三格)0.666666666666667
    e.g. 负号为左对齐
    printf(“ %-20.15f\n”, 2.0/3);
    【运行结果】
    0.666666666666667(空三格)

    • float型数据只能保证6位有效数字
    • double型数据能保证15位有效数字
    • 计算机输出的数字不都是绝对精确有效的
  • e\E格式字符:以指数型式输出浮点数

    • 科学计数法,使用指数(Exponent)表示浮点数,此处"e"的大小写代表在输出时“e”的大小写
#include <stdio.h>
int main(void)
{double d = 256.789;printf("%e\n", d); //不指定数据宽度和精度输出,默认六位小数           printf("%15.3e\n",d);  //指定数据宽度和精度输出,宽度15,三位小数return 0;
}
  • 运行结果
2.567890e+022.568e+02 前面六个空格
  • g\G格式字符:用来输出实数。

    • 根据数值的长度,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的零。
    • printf(“%g %g”,0.000000123,0.123);输出1.23E-07 0.123
    • G:指数用E表示,如输出2.345E+15

1.4 其他

1.4.1 标志

  • ‘-’(减号):结果左对齐,右边填空格。默认是右对齐,左边填空格。

1.4.2 输出最小宽度

  • 用十进制整数来表示输出的最少位数。若实际位数多于指定的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。

  • 对于实数,输出n位小数,对于字符串,截取的字符数

  • printf(“%06d”,1000);输出:001000

1.4.3 精度

  • 精度格式符以“.”开头,后跟十进制整数。

1.4.4 类型长度

  • 类型长度指明待输出数据的长度。因为相同类型可以有不同的长度,比如整型有 char(8bits)、short int(16bits),int(32bits)和 long int(64bits),浮点型有 32bits 的单精度 float64bits 的双精度 double
  • l:用于长整型整数如ld,lo,lx,lu

1.5 转义字符

  • 转义字符在字符串中会被自动转换为相应操作命令

2 scanf()

scanf()函数是格式化输入函数,它从标准输入设备(键盘) 读取输入的信息。

其调用格式为:scanf(“<格式化字符串>”,<地址表>);

2.1scanf( )函数的一般形式

  • scanf(格式控制字符串,地址列表)

    • 格式控制字符串含义与printf函数类似
    • 地址列表:可以是变量的地址,或字符串的首地址
void main( )
{ int a,b,c;scanf(“%d %d %d”,&a,&b,&c);printf(“%d,%d,%d\n”,a,b,c);
}
  • 注意:
  1. “&”为地址运算符,不得漏写。
  2. 用“%d%d%d”输入数据时,数据项之间不能用逗号而只能用空格、回车或Tab键作分隔符。

2.2 基本规则和注意事项

  1. 最小宽度可指定输入数据所占列数,系统自动截取所需数据。

如:scanf(“%3d%3d”,&a,&b);
输入123456时,则a的值为123,b的值为456 。

  1. 可在%后附加“ *”跳过相应的数据。如:

scanf(“%d%*c%d”,&a,&b);
跳过一个字符,实现以任意字符作为分隔符
scanf(“%2d %*3d %2d”,&a,&b);
输入12 345 67时,a的值为12,b的值为67。

  1. 输入数据时不能规定精度

  2. 注意问题:

    1. “格式控制”后面应当是变量地址,而不应是变量名。
    2. “格式控制”字符串除格式说明以外的其它字符,输入数据时应输入与这些字符相同的字符
    scanf() 正确输入
    1 scanf(“%d%d”,&a,&b); 1 2
    2 scanf(“%d %d”,&a,&b); 1 2或1 2(多几个空格)
    3 scanf(“%d,%d\n”,&a,&b); 1, 2
    4 scanf(“%d:%d:%d”,&m,&n,&p); 1:2:3
    5 scanf(“a=%d,b=%d,c=%d”,&a,&b,&c); a=1,b=2,c=3
    1. 在用“%c”格式输入字符时, 空格和“转义字符”都为有效字符。(没有回车)

    如:scanf(“%c%c%c”,&c1,&c2,&c3);
    若输入a b c时,则c1的值为‘a’,c2的值为空格,c3的值为‘b’。

    1. 输入数值数据时,输入非数值字符,认为该数据结束
    2. 幻影换行:在用“%c”格式输入字符时,若前面已输入数据并回车(有时必须回车),则scanf会“吃掉”回车。 文末附了详细文章解释 。
    3. 总结:
  1. scanf会以空格、制表符、换行符作为结束符,且不读走会将其留在键盘缓冲区中,给下一次输入留下隐患。
  2. %d会跳过空格、制表符、换行符(读走,不保存)直到输入变量达到指定个数。但%c什么都读,包括空格、制表符、换行符 。比如:第一次scanf输入回车结束后,scanf不读走换行符,而是留了一个‘\n’在缓冲区。则下一次再用scanf(‘%c’)就会将读入一个转义字符’\n’。一般用一个gerchar()解决。
  3. 用scanf读入字符串(%s)存在隐患,因为中间遇到空格会结束。一般用字符串函数,另一篇笔记中有详细介绍C语言 第九章 字符串

scanf(“%d%d”, &x, &ch);
等价于
scanf(“%d %d”, &x, &ch);
输入两个整型,中间空格大于等于1个(包括回车)都行。
比如12 5 或12(空三格)5
因为%d会跳过空格、制表符、换行符(读走,不保存)直到输入变量达到指定个数

3 字符数据的输入输出

存储在<stdio.h>中

3.1 字符输出函数putchar( )

向显示器输出单个字符常量或字符变量的值,一般形式为:putchar(字符常量) 或putchar(字符变量)

3.2 字符输入函数getchar( )

从计算机终端(一般为键盘)输入一个字符。一般形式为: getchar( )
假设程序要求用getchar()处理字符输入,用scanf()处理数值输入,这两个函数都能很好的完成任务,但是不能混合使用。 因为getchar()读取每个字符,包括空格、制表符和换行符;而scanf()在读取数字时则会跳过空格、制表符和换行符。

这章其实很多细节要想明白还是很难的
推荐博客。

【C语言】scanf语句吃掉回车或者空格问题详解
C语言 getchar()原理及易错点解析

C语言笔记 第三章 键盘输入与输出相关推荐

  1. 《Go语言圣经》学习笔记 第三章 基础数据类型

    <Go语言圣经>学习笔记 第三章 基础数据类型 目录 整型 浮点数 复数 布尔型 字符串 常量 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语言小白学习笔记, ...

  2. c语言如何持续输入字符直到指定字符结束_《小白学C》第三章 常用输入输出函数...

    第三章 常用输入/输出函数 与其他高级语言一样, C语言的语句是用来向计算机系统发出操作指令的. 当我们提到输入时,这意味着要向程序填充一些数据.输入可以是以文件的形式或从命令行中进行.C 语言提供了 ...

  3. Android群英传神兵利器读书笔记——第三章:Android Studio奇技淫巧

    Android群英传神兵利器读书笔记--第三章:Android Studio奇技淫巧 这篇文章篇幅较长,可以使用版权声明下面的目录,找到感兴趣的进行阅读 目录 3.1 Android Studio使用 ...

  4. 屏幕输出语句_第三章 常用输入/输出函数

    第三章 常用输入/输出函数 与其他高级语言一样, C语言的语句是用来向计算机系统发出操作指令的. 当我们提到输入时,这意味着要向程序填充一些数据.输入可以是以文件的形式或从命令行中进行.C 语言提供了 ...

  5. c语言多个附加说明符,C语言教程第三章.ppt

    <C语言教程第三章.ppt>由会员分享,可在线阅读,更多相关<C语言教程第三章.ppt(36页珍藏版)>请在人人文库网上搜索. 1.第三章,顺序结构程序设计 数据输入输出 及程 ...

  6. ACMNO.3 有三个整数a b c,由键盘输入,输出其中的最大的数。 输入 一行数组,分别为a b c 输出 a b c其中最大的数 样例输入 10 20 30 样例输出 30

    基于平台Dev-C++ 5.11 题目描述 有三个整数a b c,由键盘输入,输出其中的最大的数. 输入 一行数组,分别为a b c 输出 a b c其中最大的数 样例输入 10 20 30 样例输出 ...

  7. 计算机系统导论第九章,计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新)...

    计算机系统导论 -- 读书笔记 -- 第三章 程序的机器级表示 (持续更新) 第三章 程序的机器级表示 3.1 历史观点 3.2 程序编码 1. 命令行 (1)编译 Linux> gcc -Og ...

  8. Android群英传笔记——第三章:Android控件架构与自定义控件讲解

    Android群英传笔记--第三章:Android控件架构与自定义控件讲解 真的很久没有更新博客了,三四天了吧,搬家干嘛的,心累,事件又很紧,抽时间把第三章大致的看完了,当然,我还是有一点View的基 ...

  9. 计算机网络第七版笔记--第三章

    计算机网络第七版学习笔记 第三章数据链路层 3.1使用点对点信道的数据链路层 3.1.1数据链路和帧 1.链路(link)就是从一个结点到相邻结点的一段物理线路(有线或无线),而中间没有任何其他的交换 ...

最新文章

  1. AI化身监工,上班还能摸鱼吗?
  2. gitlab 目录tag_【环境搭建】gitlab-ci(持续集成)
  3. Scala _11SparkWordCountscala语言java语言
  4. MIT算法导论(一)——算法分析和引论
  5. 中国未来的可能性思考- 系统化思维-公司培训
  6. 双目立体视觉匹配算法-----SAD匹配算法、BM算法、SGBM算法、GC算法
  7. 40. HTTP 协议(1)
  8. 题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%; 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%; 20万到4
  9. vb中的print方法
  10. 5行java关键代码实现excel转pdf代码实战教程
  11. Flink运行时架构及各部署模式下作业提交流程
  12. 平板电脑win10 android比较好,华为MateBook名不副实!Win10平板电脑最合适
  13. BOSS创投社群:要想成为富人,得改变原有思维,谈谈什么是富人思维模式!
  14. 小猿圈python之python期末考试测试题(二)_小猿圈Python开发面试题(一)
  15. LAMP架构集成ownCloud搭建私有云盘日记
  16. 技术分享 | Goby IP库初探
  17. 预习博客(HTML标签+认识浏览器)
  18. post提交php出现502,PHP+Nginx 字符串内容 POST 提交502错误?
  19. 深入学习OpenCV文档扫描OCR识别及答题卡识别判卷(文档扫描,图像矫正,透视变换,OCR识别)
  20. 当我不再依赖你的时候说说_关于依赖一个人的说说

热门文章

  1. android 接收js对象数组,java怎么接收js 数组对象数组对象
  2. 分析Burp Intruder攻击结果
  3. Spring 使用中的设计模式
  4. 苹果AirPods Pro可充当助听器使用,说说蓝牙音频技术
  5. BREW中的IDISPLAY_DrawText()在LG、京瓷手机上的bug
  6. linux vim 复制一个单词,Vim复制粘贴与寄存器
  7. Linux服务器多网卡多网关配置解决方案
  8. mysql 时间格式比较_mysql 日期类型 比较
  9. java callable接口_Java Callable接口实现细节详解
  10. 什么是web语义化,有什么好处