C语言从入门到精通 第四章(数据的输入和输出)

本文介绍了C语言中输入输出的概念,详细讲解了printf和scanf函数的用法,包括格式控制、常用格式字符以及注意事项。特别关注了printf的格式声明和scanf的格式字符,以及如何正确使用字符输入输出函数如putchar和getchar。
摘要由CSDN通过智能技术生成

  写在前面:

  1. 本系列专栏主要介绍C语言的相关知识,思路以下面的参考链接教程为主,大部分笔记也出自该教程。
  2. 除了参考下面的链接教程以外,笔者还参考了其它的一些C语言教材,笔者认为重要的部分大多都会用粗体标注(未被标注出的部分可能全是重点,可根据相关部分的示例代码量和注释量判断,或者根据实际经验判断)。
  3. 如有错漏欢迎指出。

参考教程: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甚至可以获取回车,返回回车对应的转义字符),直到取完为止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zevalin爱灰灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值