C语言笔记 第三章 键盘输入与输出

2023-11-18

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
-123
   34
 -123
   34
 -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+02
      2.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()原理及易错点解析

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • UE4学习笔记--连接MySQL数据库(C++)

    UE4学习笔记 连接MySQL数据库 我个人是个比较水的人 在学校没好好学程序 不误正业的玩建模 现在美术和程序都不行 想想还是重新认真学程序吧 先从记笔记开始 话说我还是第一次写博客 我是跟着几位大佬的博客做的 记录一下自己的问题 以免以
  • CompletableFuture异步

    更多文章 关注 码视野 CompletableFuture是Java 8提供的一种异步编程方式 它以函数式编程API的形式提供了丰富的异步操作接口 相比于传统的Future异步方式 CompletableFuture更为灵活和易用 可以轻松
  • linux创建文件夹主机名,Linux创建、删除文件和文件夹命令

    今天学习了几个命令 是创建 删除文件和文件夹的 在linux里 文件夹是目录 下面说下我学习的命令 接下来是小编为大家收集的Linux创建 删除文件和文件夹命令 欢迎大家阅读 Linux创建 删除文件和文件夹命令 创建文件夹 mkdir 一
  • Zotero使用笔记—文献管理、做笔记、文献引用、数据备份

    先贴一张zotero的大头照 步入正题 依次介绍zotero的几大功能 一 中英文 文献管理 先看了视频1和视频2这两个基本使用教程 浏览器又搜了一点 学到了 zotero用一个条目存储一篇文献的基本信息和PDF zotero中添加一个条目
  • 注册表:无法打开 XXX 由于某个错误无法打开该密钥。详细信息:拒绝访问

    错误原因 没有注册表用户权限 正确添加用户权限的步骤如下 跟着图片步骤 右击该项 权限 选中想要添加为当前所有者的用户后 点击应用 如果没用户显示 可以从 其他用户或组 中添加进来 权限添加完毕 转载于 https www cnblogs
  • 什么吃掉了我的硬盘?

    什么吃掉了我的硬盘 http www am82 com houzan archives 4550 posted on 2010 08 15 20 29 lexus 阅读 评论 编辑 收藏 转载于 https www cnblogs com
  • L2TP和PPTP的区别

    用最短的时间搞清楚L2TP和PPTP的区别 一 相关知识铺垫 1 虚拟隧道协议 一种通过公共网络的基础设施 在专用网络或专用设备之间实现加密数据通信的技术 通信的内容是可以是任何通信协议的数据包 隧道协议将这些协议的数据包重新封装在新的包中
  • 离散系统的变换域分析【数字信号处理四】

    离散系统的变换域分析 一 求系统H z 的零 极点 幅频响应和相位响应 二 用Matlab验证DFT运算的对称性质 三 产生数字线性调频信号 分析时域波形和频谱特性 四 设计简单的OFDM系统 并验证循环前缀的作用 一 求系统H z 的零
  • (黑客)自学笔记

    一 自学网络安全学习的误区和陷阱 1 不要试图先成为一名程序员 以编程为基础的学习 再开始学习 行为 从编程开始掌握 前端后端 通信协议 什么都学 缺点 花费时间太长 实际向安全过渡后可用到的关键知识并不多 很多安全函数知识甚至名词都不了解
  • Xception论文解读

  • make/makefile的使用

    make makefile 文章目录 make makefile 初步认识makefile的工作流程 依赖关系和依赖方法 make的使用 总结 make是一个命令 是一个解释makefile中指令的命令工具 makefile是一个文件 当前
  • oracle数据库中输入date类型的数据

    给oracle数据库已有记录中更新date类型的数据 插入date类型的格式 to date 2016 01 03 12 23 19 yyyy mm dd hh24 mi ss 2016 01 03 12 23 19 表示想要插入的时间 y
  • 华为鸿蒙os今日新闻,华为正式发布鸿蒙OS,却再次被质疑

    6月2日 市场瞩目的鸿蒙产品发布会成功举办 此次华为还连发三款搭载鸿蒙系统的硬件 华为 MatePad Pro 平板 华为 Watch 3 智能手表和华为 FreeBuds 4 TWS 耳机 但事情总有两面性 喜欢你的不论你做什么都会被看好
  • 小白入坑-利用express构建一个简单的Node项目

    做了部分前端的东西 当然不能局限眼前的成果 梦想能成为全栈的大佬 然后左手一个小姐姐 右手一个富萝莉 走远了 奈于java对前端来说比较难 耗费的学习时间也比较长 所以先从node下手过一下瘾儿 首先 win r打开windows的运行框
  • 什么是堡垒机

    什么是堡垒机 1 堡垒机是用来解决 运维混乱 的 堡垒机是用来干什么的 简而言之一句话 堡垒机是用于解决 运维混乱 的 何谓运维混乱 当公司的运维人员越来越多 当需要运维的设备越来越多 当参与运维的岗位越来越多样性 如果没有一套好的机制 就
  • Git入门超详细文档

    Git Git概述 Git是一个免费的 开源的分布式版本控制系统 可以款速高效的处理从小型到大型的各种项目 Git易于学习 占地面积小 性能极佳 它具有廉价的本地库 方便的暂存区域和多个工作流分支等特性 其性能优于Subversion CV
  • 试除法判定质数模板题

    试除法判定一个数是否为质数类似于这道题 代码 include
  • mac文件夹权限的@

    demo是网站根目录 终端下执行 cd到demo ls l 显示 drwxr xr x 9 andy admin 306 10 12 17 43 demo 这里的 貌似是mac特有的 第一次使用file put contents往根目录添加
  • QMutex使用时遇到的错误

    class A public explicit A QObject parent 0 A public QMutex m mutex class B public explicit B QObject parent 0 B private
  • C语言笔记 第三章 键盘输入与输出

    文章目录 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 函数的一般形式