一.scanf()函数
scanf()中的格式字符串表明字符输入流的目标数据类型。scanf()函数使用指向变量的指针。
■ 如果用scanf()读取基本变量类型的值,在变量名前加上一个&;
■ 如果用scanf()把字符串读入字符数组中,不要使用&。
例如以下这个程序:
#include <stdio.h>
int main(void)
{
int age;
float assets;
char pet[30];
printf("enter your age,assets,and favorite pet.\n");
scanf("%d %f", &age, &assets);
scanf("%s", pet);
printf("%d $%.2f %s\n", age, assets, pet);
return 0;
}
转换说明 | 含义 |
%c | 把输入解释成字符 |
%d | 把输入解释成有符号十进制整数 |
%e、%f、%g、%a | 把输入解释成浮点数(C99标准新增了%a) |
%E、%F、%G、%A | 把输入解释成浮点数(C99标准新增了%A) |
%i | 把输入解释成有符号十进制整数 |
%o | 把输入解释成有符号八进制整数 |
%p | 把输入解释成指针(地址) |
%s | 把输入解释成字符串。从第1个非空白字符开始,到下一个空白字符之前的所有字符都是输入 |
%u | 把输入解释成无符号十进制整数 |
%x、%X | 把输入解释成有符号十六进制整数 |
转换说明 | 含义 |
* | 抑制赋值 示例:"%*d" |
数字 | 最大字段宽度。输入达到最大字段宽度处,或第1次遇到空白字符时停止 示例:"%10s" |
hh | 把整数作为signed char或unsigned char类型读取 示例:"%hhd"、"%hhu" |
ll | 把整数作为long long或unsigned long long类型读取(C99) 示例:"%lld"、"%llu" |
h、l或L | "%hd"和"%hi"表明把对应的值存储为short int类型 %ho"、"%hx"和"%hu"表明把对应的值存储为 unsigned short int 类型 "%ld"和"%li"表明把对应的值存储为long 类型 "%l0"、"%1x"和"%lu"表明把对应的值存储为unsigned" 1ong 类型 "%le"、"%lf"和"%lg"表明把对应的值存储为double 类型 在e、f和g前面使用L而不是l,表明把对应的值被存储为long double类型。如果没有修饰符,d、i、o和x表明对应的值被存储为int 类型,f和g表明把对应的值存储为float类型 |
j | 在整型转换说明后面时,表明使用intmax_t 或uintmax_t类型(C99) 示例:"%jd"、"%ju" |
z | 在整型转换说明后面时,表明使用sizeof 的返回类型(C99) 示例:"%zd"、"%zo" |
t | 在整型转换说明后面时,表明使用表示两个指针差值的类型(C99) 示例:"%td"、"%tx" |
二.printf()和scanf()的*修饰符
printf()和scanf()都可以使用*修饰符来修改转换说明的含义。但是,它们的用法不太一样。首先,我们来看printf()的*修饰符。
如果你不想预先指定字段宽度,希望通过程序来指定,那么可以用*修饰符代替字段宽度。但还是要用一个参数告诉函数,字段宽度应该是多少。也就是说,如果转换说明是%*d,那么参数列表中应包含*和 d 对应的值。这个技巧也可用于浮点值指定精度和字段宽度。