1.字符数据的输入输出
在 C 语言中,字符数据的输入输出主要通过标准库函数来实现。
输入:
getchar()
函数用于从标准输入(通常是键盘)获取一个字符。
输出:
putchar()
函数用于向标准输出(通常是屏幕)输出一个字符。
括号内可以是字符型变量或整型变量。
2.格式输入与输出
1.格式输入输出主要通过scanf()
和printf()
函数来实现
scanf()
函数:用于从标准输入读取格式化的数据。
它的一般格式为:scanf("格式控制字符串", 地址列表)
printf()
函数:用于向标准输出打印格式化的数据。
它的一般格式为:printf("格式控制字符串", 输出列表)
2.printf
常用的格式字符及其含义
%d
:以十进制形式输出带符号整数;%u
:以十进制形式输出无符号整数;%f
:以小数形式输出单精度或双精度实数;%c
:输出一个字符;%s
:输出字符串;%p
:输出指针地址;%e
或%E
:以指数形式输出实数,其中%e
使用小写字母e
,%E
使用大写字母E
;%x
或%X
:以十六进制形式输出无符号整数,其中%x
使用小写字母a-f
,%X
使用大写字母A-F
;%o
:以八进制形式输出无符号整数;%g
或%G
:根据数值的大小,自动选择%f
或%e
(或%E
)中较短的一种输出方式,且不输出无意义的零。
此外,还可以在%
和格式字符中间插入格式修饰符,用于更精确地控制输出格式,常见的格式修饰符包括:
- 标志字符:
-
:左对齐,默认为右对齐(当输出实际长度小于输出最小宽度时,右边补空格);+
:右对齐,正数输出+
,负数输出-
(当输出实际长度小于输出最小宽度时,左边补空格);#
:对于%o
、%x
或%X
,输出前缀(如八进制的0
、十六进制的0x
或0X
);对于%f
、%e
或%E
,强制输出小数点,即使后面没有数字;空格
:正数输出空格,负数输出-
;0
:当实际位数少于最小宽度时在前面补0
;
- 输出最小宽度:用十进制整数表示输出的最少位数,若实际位数多于定义的宽度,则按实际位数输出,实际位数少于定义的宽度则补以空格或
0
; - 精度:用“小数点”加“十进制正整数”表示,具体含义如下:
- 对于整数(
d
、i
、o
、u
、x
、X
):表示输出的最小数字个数,不足则前面补零,超过则按原长度输出; - 对于浮点型(
f
、e
、E
):表示小数点后至多输出的数字个数,不足则后面补数字0
,多则做四舍五入处理; - 对于字符串(
s
):表示最多输出的字符个数,不足则后面补空格,多则截断;
- 对于整数(
- 数据长度修饰符:
h
:表示以短整型或无符号短整型输出整数,或以单精度输出浮点数;l
(小写的L
):表示以长整型或无符号长整型输出整数,或以双精度输出浮点数;ll
(两个小写的L
):表示以 64 位长整型输出整数。
3.scanf常用的格式字符及其含义
scanf
格式字符串的一般形式为:%(*)(输入数据宽度)(长度)格式字符
,其中方括号()
内的部分为可选项。各项的意义如下:
- 格式字符:
u
:读取一个十进制形式的无符号整数。d
:读取一个十进制形式的有符号整数。o
:读取一个八进制形式的整数。x
或X
:读取一个十六进制形式的整数,x
使用小写字母,X
使用大写字母。f
、e
、E
、g
、G
:读取一个浮点数,可以是小数形式或指数形式。c
:读取一个字符。需注意,输入字符时,空格和回车键也会被当作有效字符输入。s
:读取一个字符串,遇到空白字符(空格、制表符、换行符)停止。p
:读入一个指针值。n
:不读入任何字符,而是把到该位置已读入的字符数存储到与之对应的int*
指向的位置。若带有*
或域宽信息(如%*n
或%3n
等),其后果是未定义的。%
:读入%
符号(百分号)。
-
*
:这是一个抑制符,用以表示输入的数据不赋值给相应的变量,即跳过该输入值。例如:scanf("%d%*d%d",&a,&b);
,当输入为1 2 3
时,把1
赋予a
,2
被跳过,3
赋予b
。 -
宽度:用十进制整数指定输入的宽度(即字符数)。例如:
scanf("%5d",&a);
,输入12345678
只把12345
赋予变量a
,其余部分被截去。 -
长度:长度格式符为
l
和h
。l
表示输入长整型数据(如%ld
)、双精度浮点数(如%lf
),或与c
、s
配合使用表示对应宽字符(wchar_t
)数据;h
表示输入短整型数据。
4.使用printf和scanf的注意点
- 输入/输出的数据类型要与格式字符严格匹配,否则可能导致错误或未定义的行为。
scanf
函数要求提供变量地址,printf
则直接使用变量名。- 输入多个数据时,
scanf
格式控制串中若无间隔符,可用空格、制表符或回车键分隔;若有非格式字符作间隔符,则输入时也要加上相应字符。 - 对于
scanf
的字符输入,若格式控制串中无非格式字符,所有输入字符均有效;对于字符串输入(%s
),要防止输入字符串过长导致缓冲区溢出。 printf
和scanf
函数均无精度控制,如scanf("%5.2f",&a);
和printf("%5.2f",a);
都是非法的。