格式化输入函数scanf()及输入输出函数的*修饰符
2012-09-27 13:37
225 查看
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个。
#include <stdio.h> int main(void) { char ch1, ch2; int i; scanf("%c,%c", &ch1, &ch2); printf("%c,%c\n", ch1, ch2); scanf(" %c , %c", &ch1, &ch2); printf("%c,%c\n", ch1, ch2); scanf(" %d", &i); printf("i = %d\n", i); return 0; }
在Vc++6.0中的输出结果为:
![](http://pic002.cnblogs.com/images/2012/451382/2012092700210513.png)
4.printf()函数的*修饰符
假定不想事先制定字段宽度,而是希望由程序来指定该值,可以在字段宽度部分使用*来代替数字来达到目的,但是也必须使用一个参数来告诉函数字段宽度应该是什么。也就是说,如果转换说明符是%*d ,那么参数列表中应该包括一个 * 值和一个 d 的值。同时这种方式也可以和浮点数一起使用来指定精度和字段宽度。#include <stdio.h> int main(void) { unsigned int width, precision; int num = 256; double weight = 123.45; printf("What field width?\n"); scanf("%d", &width); printf("The number is: %*d:\n", width, num); printf("Enter a width and a precision:\n"); scanf("%d %d", &width, &precision); printf("Weight = %*.*f\n", width, precision, weight); return 0; }
在Vc++6.0中的输出结果为:
![](http://pic002.cnblogs.com/images/2012/451382/2012092700291722.png)
在这里,第一个问题的答案是8,所以8就是所用的字段宽度。与之类似,第二个输入指示字段宽度为6,小数点右边有3位数字。
5.scanf()函数的*修饰符
在scanf()函数中,当把 * 放在 % 和说明符字母之间时,它使函数跳过相应的输入项目。6.scanf()函数应对非法输入的处理
#include <stdio.h> int main(void) { int i, j; char ch; scanf("%d", &i); printf("i = %d\n", i); while ( (ch=getchar()) != '\n') continue; scanf("%d", &j); printf("j = %d\n", j); return 0; } /* 通过while循环把上面 i 输入后的多的垃圾字符跳过 如果没有while循环,在调试时输入 i = 123asdfg 在Vc++6.0中的输出结果为: 123asdfg i = 123 j = -858993460 */
在Vc++6.0中的输出结果为:
![](http://pic002.cnblogs.com/images/2012/451382/2012092713350595.jpg)
相关文章推荐
- C语言中scanf格式化输入函数
- C语言scanf()函数:格式化输入函数
- 格式化输入函数scanf
- C:指针、数据类型、格式化输入输出、输入函数的坑点
- C语言中scanf格式化输入函数
- c中scanf的格式化输入函数
- 格式化输入(scanf)输出(printf)函数
- scanf( )函数的格式化输入
- scanf和printf函数家族用于格式化输入和输出(转)
- C语言scanf()函数:格式化输入函数
- C语言中scanf格式化输入函数
- 关于scanf格式化输入函数的小问题
- C语言的格式化输入函数scanf
- C语言中scanf格式化输入函数
- 处理格式化输入函数scanf遇空格停止问题
- 第四章 - 字符串和格式化输入输出——scanf()函数
- c语言:用scanf函数输入数据,举例并分析错误原因
- php中格式化输出函数vprintf printf sprintf sscanf
- 2.6 输入一个除空格以外的可见字符(保证在函数scanf中可使用格式说明符%c读入),输出其ASCII码。
- C语言(六):格式化输出与输入函数