1.scanf()输入控制符
1.1 转换说明符
转换说明符 | 意 义 |
%c | 把输入解释成一个字符 |
%d | 把输入解释成一个有符号十进制整数 |
%e,%f,%g,%a | 把输入解释成一个浮点数(%a 是C99标准) |
%E,%F,%G,%A | 把输入解释成一个浮点数(%A是C99标准) |
%i | 把输入解释成一个有符号十进制整数 |
%o | 把输入解释成一个有符号八进制整数 |
%p | 把输入解释成一个指针(一个地址) |
%s | 把输入解释成一个字符串:输入的内容是以第一个非空白字符作为开始, 并且包含直到下一个空白字符的全部字符 |
%u | 把输入解释成一个无符号十进制整数 |
%x,%X | 把输入解释成一个有符号十六进制整数 |
1.2 转换修饰符
修饰符 | 意 义 |
* | 滞后赋值 示例:“%*d” |
digit(s) | 最大字段宽度:在达到最大字段宽度或者遇到第一个空白字符时(不管哪个先发生都一样) 停止对输入项的读取 示例:"%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 中。 "%lo"、"%lx" 和"%lu"指示该值将会存储在一个 unsigned long 中。 "%le"、"%lf" 和 "%lg" 指示该值以double类型 存储。将L(而非l)与e、f 和 g 一起指示该值以 long double 类型存储。 如果没有这些修饰符, d、 i、 o 和 x 指示 int 类型,而e、f 和 g 指示 float 类型 |
2.scanf()的返回值
scanf()函数返回成功读入的项目的个数。如果没有读取任何项目(如它期望一个数字但是出入了一个非数字字符),它会返回值0。当它检测到“文件结尾”时,它返回EOF(EOF是文件stdio.h中定义的特殊值。一般,#define 指令把EOF 的值定义为 -1)。
3.用%c读入空格与字符的问题
如果在格式字符串中%c之前有一个空格,那么scanf()会跳到第一个非空白字符处。也就是说,命令scanf(“%c”,&ch)读取在输入中遇到的第一个字符,而scanf(“ %c”,&ch)(%c前有个空格)则读取遇到的第一个非空白字符。
对于同时输入几个字符,如果逗号(或任何非空格字符)和第一个%c之间没有间隔,则输入时,第一个字符与逗号之间也不能有间隔;如果有空格,则输入时,第一个字符和逗号之间可以有任意多个字符,也可以是0个。如果逗号和第二个%c之间没有间隔,则逗号和第二个输入字符间也不能有间隔。如果有空格,则输入时,第二个字符和逗号之间可以有任意多个字符,也可以是0个。
1 #include <stdio.h> 2 3 int main(void) 4 { 5 char ch1, ch2; 6 int i; 7 8 scanf("%c,%c", &ch1, &ch2); 9 printf("%c,%c\n", ch1, ch2); 10 11 scanf(" %c , %c", &ch1, &ch2); 12 printf("%c,%c\n", ch1, ch2); 13 14 scanf(" %d", &i); 15 printf("i = %d\n", i); 16 17 return 0; 18 }
在Vc++6.0中的输出结果为:
4.printf()函数的*修饰符
假定不想事先制定字段宽度,而是希望由程序来指定该值,可以在字段宽度部分使用*来代替数字来达到目的,但是也必须使用一个参数来告诉函数字段宽度应该是什么。也就是说,如果转换说明符是%*d ,那么参数列表中应该包括一个 * 值和一个 d 的值。同时这种方式也可以和浮点数一起使用来指定精度和字段宽度。
1 #include <stdio.h> 2 3 int main(void) 4 { 5 unsigned int width, precision; 6 int num = 256; 7 double weight = 123.45; 8 9 printf("What field width?\n"); 10 scanf("%d", &width); 11 printf("The number is: %*d:\n", width, num); 12 printf("Enter a width and a precision:\n"); 13 scanf("%d %d", &width, &precision); 14 printf("Weight = %*.*f\n", width, precision, weight); 15 16 return 0; 17 }
在Vc++6.0中的输出结果为:
在这里,第一个问题的答案是8,所以8就是所用的字段宽度。与之类似,第二个输入指示字段宽度为6,小数点右边有3位数字。
5.scanf()函数的*修饰符
在scanf()函数中,当把 * 放在 % 和说明符字母之间时,它使函数跳过相应的输入项目。
6.scanf()函数应对非法输入的处理
1 #include <stdio.h> 2 3 int main(void) 4 { 5 int i, j; 6 char ch; 7 8 scanf("%d", &i); 9 printf("i = %d\n", i); 10 11 while ( (ch=getchar()) != '\n') 12 continue; 13 14 scanf("%d", &j); 15 printf("j = %d\n", j); 16 17 return 0; 18 } 19 /* 20 通过while循环把上面 i 输入后的多的垃圾字符跳过 21 如果没有while循环,在调试时输入 i = 123asdfg 22 在Vc++6.0中的输出结果为: 23 123asdfg 24 i = 123 25 j = -858993460 26 */
在Vc++6.0中的输出结果为: