写在前面:
- 本系列专栏主要介绍C语言的相关知识,思路以下面的参考链接教程为主,大部分笔记也出自该教程。
- 除了参考下面的链接教程以外,笔者还参考了其它的一些C语言教材,笔者认为重要的部分大多都会用粗体标注(未被标注出的部分可能全是重点,可根据相关部分的示例代码量和注释量判断,或者根据实际经验判断)。
- 如有错漏欢迎指出。
参考教程:C语言程序设计从入门到进阶【比特鹏哥c语言2024完整版视频教程】(c语言基础入门c语言软件安装C语言指针c语言考研C语言专升本C语言期末计算机二级C语言c语言_哔哩哔哩_bilibili
一、概述
1、输入输出的概念
(1)从前面的程序可以看到,一个能实现一定功能的程序基本都包含输入输出,至少没有输出的程序是没有任何意义的。
(2)所谓输入输出是以计算机为主体而言的,从计算机向输出设备(如显示器、打印机)输出数据的过程称为输出,从输入设备(如键盘、光盘、扫描仪)向计算机输入数据的过程称为输入。
2、C语言中实现输入和输出
(1)C语言本身不提供输入输出语句,输入和输出操作是由C标准函数库中的函数来实现的。
(2)在C标准库中提供了一些输入输出函数,例如printf函数和scanf函数,需要注意的是,它们并不是C语言的关键字,只是库函数的名字而已。
(3)C语言函数库中有一批标准输入输出函数,它是以标准的输入输出设备(一般为终端设备)为输入输出对象的,其中有putchar(输出字符)、getchar(输入字符)、printf(输出)、scanf(格式输入)、puts(输出字符串)和gets(输入字符串)。
(4)使用C语言函数库中的标准输入输出函数时,需要在程序文件的开头用预处理指令“#include <文件名>”把头文件stdio.h放在本程序中。
二、用printf函数输出数据
1、printf函数的一般格式
printf(格式控制, 输出表列)
(1)“格式控制”是用双撇号括起来的一个字符串,称为格式控制字符串,简称格式字符串,它包含两个信息:
①格式声明。格式声明由“%”和格式字符组成,如“%d”、“%f”等,它的作用是将输出的数据转换为指定的格式后输出。
②普通字符。普通字符即需要在输出时原样输出的字符。
(2)输出表列是程序需要输出的一些数据(逗号分隔),可以是常量、变量或表达式。
(3)下面是printf函数的一个具体例子,底纹为蓝色的就是格式声明,它们按顺序对应后面输出表列(逗号分隔)中的表达式,输出时格式声明会分别被它们所对应的表达式的内容所替换,其它的都是非格式声明的普通字符,它们全部按原样输出。
(4)由于printf是函数,因此格式字符串和输出表列实际上都是函数的参数。
2、常用的格式字符
(1)d格式符:用来输出一个有符号的十进制整数,在输出时按十进制整型数据的实际长度输出,正数的符号不输出。
①%d:不指定输出数据的长度,由系统根据数据的实际情况决定数据所占的列数。
②%md:指定输出数据所占的列数为m,如果指定的列数小于实际数据长度,则以实际数据长度输出;如果指定的列数大于实际数据长度,则在指定数据长度内以右对齐的方式输出。
③%-md:指定输出数据所占的列数为m,如果指定的列数小于实际数据长度,则以实际数据长度输出;如果指定的列数大于实际数据长度,则在指定数据长度内以左对齐的方式输出。
(2)c格式符:用来输出一个字符。
(3)s格式符:用来输出一个字符串。
(4)f格式符:用来输出实数(包括单精度、双精度、长双精度),以小数形式输出。
①%f:不指定输出数据的长度,由系统根据数据的实际情况决定数据所占的列数,系统处理的方法一般是把实数中的整数部分全部输出,小数部分输出6位。
②%m.nf:指定数据宽度和小数位数,并且输出的数据在输出数据宽度内向右对齐,“%m.nf”表示指定输出的数据占m列,其中包括n位小数,对其后一位采取四舍五入方法处理。
③%-m.nf:指定数据宽度和小数位数,并且输出的数据在输出数据宽度内向左对齐,“%-m.nf”表示指定输出的数据占m列,其中包括n位小数,对其后一位采取四舍五入方法处理。
(5)e格式符:指定以指数形式输出实数。(用“e”格式符时指数用“e”表示,用“E”格式符时指数用“E”表示)
①%e:不指定输出数据的长度,系统处理的方法一般是给出数字部分的小数位为6位,指数部分占5列,数值按标准化指数形式(小数点前有且只有1位非零数字)输出。
②%m.ne:指定数据宽度和小数位数,并且输出的数据在输出数据宽度内向右对齐,“%m.nf”表示指定输出的数据占m列,其中包括n位小数,对其后一位采取四舍五入方法处理。
③%-m.ne:指定数据宽度和小数位数,并且输出的数据在输出数据宽度内向左对齐,“%-m.ne”表示指定输出的数据占m列,其中包括n位小数,对其后一位采取四舍五入方法处理。
(6)u格式符:用来输出一个无符号的十进制整数,在输出时按十进制整型数据的实际长度输出,正数的符号不输出。
①%u:不指定输出数据的长度,由系统根据数据的实际情况决定数据所占的列数。
②%mu:指定输出数据所占的列数为m,如果指定的列数小于实际数据长度,则以实际数据长度输出;如果指定的列数大于实际数据长度,则在指定数据长度内以右对齐的方式输出。
③%-mu:指定输出数据所占的列数为m,如果指定的列数小于实际数据长度,则以实际数据长度输出;如果指定的列数大于实际数据长度,则在指定数据长度内以左对齐的方式输出。
(7)p格式符:用来输出一个用十六进制数表示的地址,通常用来输出指针变量。
(8)%格式符:用来输出一个百分号,它不对应输出表列。
3、其它格式字符
(1)i格式符:作用与d格式符相同,但是一般习惯使用d格式符。
(2)o格式符:将内存单元中的各位的值(0或1)按八进制形式输出,输出的数值不带符号,即将符号位也一起作为八进制数的一部分输出,不输出前导符“0”。
(3)x格式符:将内存单元中的各位的值(0或1)按十六进制形式输出,输出的数值不带符号,即将符号位也一起作为十六进制数的一部分输出,十六进制数的a~f以小写形式输出,不输出前导符“0x”。
(4)X格式符:将内存单元中的各位的值(0或1)按十六进制形式输出,输出的数值不带符号,即将符号位也一起作为十六进制数的一部分输出,十六进制数的A~F以大写形式输出,不输出前导符“0X”。
(5)g格式符:用来输出浮点数,系统自动在f格式和e格式中选择输出长度较短的格式,不输出无意义的0。(用“g”格式符时指数用“e”表示,用“G”格式符时指数用“E”表示)
4、格式附加字符
(1)综合上面的介绍,格式声明的一般形式可以表示为
% <附加字符><格式字符>
(2)printf函数中用到的格式附加字符:
字符 | 说明 |
m(代码一个正整数) | 数据最小宽度 |
n(代码一个正整数) | 对实数,表示输出n位小数;对字符串,表示截取的字符个数 |
l | 以长整型整数形式输出,可加在格式字符串d、o、x、u前面 |
ll | 以双长整型整数形式输出,可加在格式字符串d、o、x、u前面 |
h | 以短整型整数形式输出,可加在格式字符串d、o、x、u前面 |
- | 输出的数字或字符在域内向左靠 |
(3)正确使用格式附加字符可以避免在输出变量时发生“整型提升”或者“高位截断”:
①比如输出一个短整型变量,如果对应的格式字符为d,那么会出现整型提升,这时可以添加附加字符h,就不会发生整型提升了。
②比如输出一个双长整型变量,如果对应的格式字符为d,那么会出现高位截断,这时可以添加附加字符ll,就不会发生高位截断了。
三、用scanf函数输入数据
1、scanf函数的一般形式
scanf(格式控制, 地址表列)
(1)“格式控制”的含义同printf函数。
(2)“地址表列”是由若干个地址组成的表列(逗号分隔),可以是变量的地址或字符串的首地址。
2、scanf函数中的格式声明
(1)与printf函数中的格式声明相似,以“%”开始,以一个格式字符结束,中间可以加入附加的字符。
(2)scanf函数中用到的格式字符:
格式字符 | 说明 |
d,i | 输入有符号的十进制整数 |
u | 输入无符号的十进制整数 |
o | 输入无符号的八进制整数 |
x,X | 输入无符号的十六进制整数 |
c | 输入单个字符 |
s | 输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志’\0’作为其最后一个字符 |
f | 输入实数,可以用小数形式或指数形式输入 |
e,E,g,G | 与f作用相同 |
(3)scanf函数中用到的格式附加字符:
字符 | 说明 |
l | 输入长整型数据(%ld、%lo,%lx,%lu)以及double型数据(%lf或%le) |
ll | 输入双长整型数据(%lld、%llo,%llx,%llu) |
h | 输入短整型数据(%hd,%ho,%hx) |
域宽 | 指定输入数据所占宽度(列数),域宽应为正整数 |
* | 本输入项在读入后不赋给相应的变量 |
3、使用scanf函数时应注意的问题
(1)scanf函数中的格式控制后面应当是变量地址(往后会详细介绍,目前知道变量名前加“&”表示该变量的地址即可),而不是变量名。
(2)如果在格式控制字符串中除了格式声明以外还有其它字符,则在输入数据时在对应位置上应输入与这些字符相同的字符。
(3)在用“%c”格式声明输入字符时,空格字符和转义字符都作为有效字符输入,所以在涉及字符输入时不要轻易输入空格。
(4)在输入数值数据时,如输入空格、回车、Tab键或遇非法字符(不属于数值的字符),则认为该数据结束。
四、字符输入输出函数
1、用putchar函数输出一个字符
(1)putchar函数的一般形式为
putchar(c)
(2)“putchar(c)”的作用是输出是一个字符,具体输出什么字符和它的参数c有关:
①参数c可以是一个字符变量,那么输出的就是该字符变量存储的ASCII码所对应的字符。
②参数c可以是一个字符常量,那么输出的就是这个字符常量。
③参数c可以是0~127之间的一个整数,那么输出的就是这个整数作为ASCII码所对应的字符。
④如果参数c是一个表达式,则先将表达式的结果计算出来,再把它作为参数按上面的规则进行字符的输出。
2、用getchar函数输入一个字符
(1)getchar函数的一般形式为
getchar()
(2)“getchar()”的作用是从计算机终端(一般是键盘)输入一个字符,然后将该字符作为返回值,返回值可以赋给字符变量或整型变量,也可以不赋给任何变量,而是作为表达式的一部分。
(3)如果一口气输入一大串字符,getchar每被调用一次,就会从输入字符串的左边开始取一个字符(getchar甚至可以获取回车,返回回车对应的转义字符),直到取完为止。