您的位置:首页 > 其它

格式化输入函数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中的输出结果为:



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中的输出结果为:



  在这里,第一个问题的答案是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中的输出结果为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: