【C学习随笔】C语言I/O函数printf()和scanf()

输出函数 printf()

printf函数打印数据的指令要与待打印数据的类型相匹配,
例如打印整数用%d,打印字符类型用%c
以下是转换说明以及打印后结果。

%a 浮点数,十六进制数和p计数法(C99和C11)
%A 浮点数,十六进制数和p计数法(C99和C11)
%c 单个字符
%d 有符号十进制整数
%e 浮点数,e计数法
%E 浮点数,e计数法
%f 浮点数,十进制计数法
%g 根据数值的不同,自动选择%f或%e。%e的格式用于指数小于等于-4或者大于等于精度时
%G 根据数值的不同,自动选择%f或%E。%E的格式用于指数小于等于-4或者大于等于精度时
%i 有符号十进制整数
%o 无符号八进制整数
%p 指针
%s 字符串
%u 无符号十进制整数
%x 无符号十六进制整数,使用十六进制数0f
%X 无符号十六进制整数,使用十六进制数0F
%% 打印一个百分号

printf()函数的格式 printf(格式字符串,待打印1,待打印2);
例子:

1
2
3
4
5
6
7
8
#include <stdio.h>

int main(void){
char name[] = "wo shi shifeng";
char message[] = "wo e le";
printf("%s\n%s\n", name, message);
return 0;
}

printf的转换说明修饰符

  • 标记
    - + 空格 #0可以不使用或者使用多个标记
    示例"%-10d"

  • 数字
    最小字段宽度,如果该字段不能容纳打印的数字或字符串,系统会使用更宽的字段。
    示例"%4d"

  • .数字
    精度
    对于%e%E%f转换,表示小数点右边数字的位数
    对于%g%G转换,表示有效数字最大位数
    对于%s转换表示待打印字符的最大数量
    对于整型转换,表示待打印数字的最小位数
    如果有必要,使用前导0来达到这个位数
    只是用.表示其后跟随一个0,所以%.f%0.f一样
    示例"%5.2f"打印一个浮点数,字符宽度为5字符,其中小数点后有两位数字

  • h
    和整型转换说明一起使用,表示short int 或 unsigned short int类型的值
    示例"%hu","%hx","%6.4hd"

  • hh
    和整型转换说明一起使用,表示signed char 或 unsigned char类型的值
    示例"%hhu","%hhx","%6.4hhd"

  • j
    和整型转换说明一起使用,表示intmax_t 或 uintmax_t类型的值,这些类型定义在stdint.h头文件中
    示例"%jd","%8jx"

  • l
    和整型转换说明一起使用,表示long int 或 unsigned long int 类型的值
    示例"%ld","%8lu"

  • ll
    和整型转换说明一起使用,表示long long int 或 unsigned long long int 类型的值(C99)
    示例"%lld","%8llu"

  • L
    和浮点转换说明一起使用,表示long double 类型的值
    示例"%Ld","%10.4Le"

  • t
    和整型转换说明一起使用,表示ptrdiff_t 类型的值。ptrdiff_t 是两个指针差值的类型(C99)
    示例"%td","%12ti"

  • z
    和整型转换说明一起使用,表示size_t 类型的值。size_t 是sizeof返回的类型(C99)
    示例"%zd","%12zd"

printf的标记

-待打印项左对齐,
示例"%-20s"

+有符号值若为正则在前面显示加号,若为负,则在值前面显示减号,
示例"%+6.2f"

空格有符号值若为正则在前面显示前导空格,若为负,则在值前面显示减号,
示例"%6.2f"

#,把结果转换为另外一种形式。如果是%o则以0开始,若是%x,%X,则以0x,0X开始;对于所有的浮点格式,#保证了即使后面没有任何数字,也打印一个小数点字符。对于%g,%G,#防止结果后面的0被删除。
示例"%#o","%#8.0f","%+#10.3e"

0对于数值格式,用前导0代替空格填充字段宽度。对于整数格式,如果出现-标记或者指定精度,则忽略该标记。

输入函数 scanf()

printf()的区别是,printf()使用变量,常量,和表达式,scanf()函数使用只想变量的指针。
特征:
1.如果使用scanf()读取基本变量类型的值,在变量名前加一个&。
2.如果用scanf()把字符串读入字符数组中,不要使用&。

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main(void){
char name[30];
int age;
scanf("%s", name);
scanf("%d", &age);
printf("%s\n%d\n", name, age);
return 0;
}

scanf()函数会使用空白(换行符,制表符,空格)把输入分为多个字段,再依次把转换说明和字段匹配时跳过空白。

唯一例外的是%c转换说明,根据%cscanf()会读取每个字符,包括空白。

scanf()的转换说明和printf()几乎相同,但有细小区别如下:
对于float类型和double类型printf()都使用%f,%e,%E,%g,%G转换说明。而scanf()只把他们用作float类型,对于double类型时要使用l修饰符。如下示例:

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main(void){
char name[30];
double age;
scanf("%s", name);
scanf("%lf", &age);
printf("%s\n%f\n", name, age);
return 0;
}