scanf()函数和printf()函数是输入/输出函数,也成为I/O函数,两者工作原理相同,都使用格式字符串和参数列表。
scanf()输入函数
scanf()函数把输入转换成整数、浮点数、字符或者字符串,例如
scanf(%d %f", &x, &y);
其中,百分号%开头的符号称为转换说明,%d表示整型数据,%f表示浮点型数据。上述代码意思是输入整数x和浮点数y。转换说明的个数需要与变量的个数相同,否则会出现未知错误。
注意,在读取基本变量类型时,要在变量名前加上
&;如果读取的是字符数组,则不要加&。&是地址运算符,表示变量存储的地址。
使用的转换说明如下表
| 转换说明 | 把变量解释为 |
|---|---|
%c | 字符 |
%d或%i | 有符号十进制整数 |
%e或%E、%f或%F、%g或%G、%a或%A | 浮点数 |
%o | 有符号八进制整数 |
%p | 指针(地址) |
%s | 字符串 |
%u | 无符号十进制整数 |
%x或%X | 有符号十六进制数 |
在上述转换说明中,百分号%和字母之间可以使用修饰符,如下表
| 修饰符 | 含义 |
|---|---|
* | 抑制赋值 |
| 数字 | 最大字段宽度。达到最大宽度或遇到空白字符则停止读取 |
hh | 把整数作为signed char或unsigned char类型读取 |
ll | 把整数作为long long或unsigned long long类型读取 |
h、l或L | %hd或%hi存储为short int类型;%ho、%hx和%hu存储为unsigned short int类型; %ld和%li存储为long类型;%lo、%lx和%lu存储为unsigned long类型;%le、%lf和%lg存储为double类型;%Le、%Lx和%Lu存储为long double类型 |
j | 与整型转换说明一起使用,表示使用intmax_t或uintmax_t类型 |
z | 在整型转换说明一起使用,表示使用sizeof的返回类型size_t |
t | 与整型转换说明一起使用,表示两个指针差值类型ptrdiff_t |
其中,
intmax_t和uintmax_t类型定义在stdint.h的头文件中。
*修饰符抑制赋值表示跳过相应的项,例如
scanf("%*d %*d %d", &a);
表示跳过前两个整数读取,把输入的第3个整数赋值给a。
在scanf()函数中,如果出现空格字符外的普通字符,则在输入时要严格匹配,例如
scanf("%d,%d", &x, &y);
必须输入一个数字,一个逗号,再一个数字,如果逗号和数字中间有空格的话也没有关系,scanf()函数会跳过空格。实际上,除了%c,其它的转换说明都能跳过空格,而%c会读取空格,因此要特别注意%c的情况。
scanf()作为一个函数,它也有返回值,返回的是成功读取的项数。如果没有成功读取任何项,则返回0。当读取到文件尾时,返回EOF。
printf()输出函数
printf()函数与scanf()函数正好相反,同样需要转换说明与变量项匹配,例如
int x = 2;
printf("%d%", x);
表示输出整型变量x。转换说明如下表
| 转换说明 | 含义 |
|---|---|
%a或%A | p记数法表示的十六进制浮点数 |
%c | 单个字符 |
%d或%i | 有符号十进制数 |
%e或%E | e记数法表示的浮点数 |
%f | 十进制浮点数 |
%g或%G | 自动选择%f、%e或%E,%e或%E格式用于指数小于-4或者大于等于精度时 |
%o | 无符号八进制数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制整数 |
%x或%X | 无符号十六进制数,使用0f或0F |
如果要输出单个百分号
%,则需要连续写两个百分号%%。
float类型会转化为double类型输出。
待打印的项也可以是表达式。但是,格式字符串中转换说明要与待打印的项相匹配,否则就会得到无意义的结果。
在百分号%和字符之间插入其它字符可以修饰上述的转换说明,常见的修饰符如下表
| 修饰符 | 含义 |
|---|---|
h | 与整型转换说明一起使用,表示short int或unsigned short int类型 |
hh | 与整型转换说明一起使用,表示signed char或unsigned char类型 |
j | 与整型转化说明一起使用,表示intmax_t或uintmax_t类型 |
l | 与整型转化说明一起使用,表示long int或unsigned long int类型 |
ll | 与整型转换说明一起使用,表示long long int或unsigned long long int类型 |
L | 与浮点转化说明一起使用,表示long double类型 |
t | 与整型转换说明一起使用,表示ptrdiff_t类型 |
z | 与整型转换类型一起使用,表示size_t类型 |
这些修饰符还可以是数字。如果是一个整数,则表示最小字宽度,比如%4d,表示占用4位的整数。如果实际宽度超过限定值,系统会自动使用更宽的字段。
如果是小数点.加数字的形式,则表示精度,例如%.2f,表示以四舍五入保留两位小数;如果用%e或%E转换,也表示保留小数点后的位数;如果用%g或%G转换,表示有效数字最大位数;如果用%s转换,表示字符的最大数量;如果是整数,表示数字的最小位数。
上述两种方式可以结合使用,如%4.2f,表示占用4个宽度,小数点后保留2位。
在转换说明中,也可在%后加上标记
| 标记 | 含义 |
|---|---|
- | 待打印项左对齐 |
+ | 显示打印有符号数字的符号。如果是整数,显示加号+;若为负数,显示减号- |
| 空格 | 若是有符号的负数,则显示减号-;若是有符号正数,显示加号+ |
# | 转换成另一种格式。以八进制输,数字出前会显示0;以十六进制输出数字前会显示0x或0X; |
0 | 用0填充空格。如果出现减号-,则忽略 |
printf()函数也有*修饰符,可在参数列表中指定字段宽度,例如
int width = 5;
int precision = 2;
float x = 2.2;
printf("%*.*f", width, precision, x);
width和precision的值会替代转换说明里的*。
最后,printf()函数也有返回值,它返回打印字符的个数。如果输出错误,则返回负值。
字符串输入和输出
字符串除了可使用scanf()和printf()函数外,还有专门的输入和输出函数,详细可戳此链接。
本文深入解析C语言中的scanf()和printf()函数,探讨其在输入输出操作中的应用,包括格式字符串、变量类型转换及常见修饰符的使用,是理解和掌握C语言I/O操作的关键。
1866

被折叠的 条评论
为什么被折叠?



