printf与scanf
1、printf()函数返回打印字符的个数,如果有输出错误,则返回一个负值。
2、在scanf中对于%c,在格式字符串中添加一个空格字符会有所不同。例如,如果把%c放在格式字符串中的空格前面,scanf()便会跳过空格,从第1个非空白字符开始读取。也就是说,scanf("%c", &ch)从输入中的第1个字符开始读取,而scanf(" %c", &ch)则从第1个非空白字符开始读取。scanf()函数返回成功读取的项数。如果没有读取任何项,且需要读取一个数字而用户却输入一个非数值字符串,scanf()便返回0。当scanf()检测到“文件结尾”时,会返回EOF(EOF是stdio.h中定义的特殊值,通常用#define指令把EOF定义为-1)。
3、*的修饰符
(1)、printf()和scanf()都可以使用*修饰符来修改转换说明的含义。但是,它
们的用法不太一样。首先,我们来看printf()的*修饰符。
如果你不想预先指定字段宽度,希望通过程序来指定,那么可以用*修
饰符代替字段宽度。但还是要用一个参数告诉函数,字段宽度应该是多少。
也就是说,如果转换说明是%*d,那么参数列表中应包含*和 d对应的值。这
个技巧也可用于浮点值指定精度和字段宽度。程序清单4.16演示了相关用
法。
#include <stdio.h>
int main() {
unsigned width, precision;
int number = 256;
double weight = 242.5;
printf("Enter a field width:\n");
scanf("%d", &width);
printf("The number is :%*d:\n",width, number);
printf("Now enter a width and aprecision:\n");
scanf("%d %d", &width,&precision);
printf("Weight = %*.*f\n", width,precision, weight);
printf("Done!\n");
return 0;
}
变量width提供字段宽度,number是待打印的数字。因为转换说明中*在
d的前面,所以在printf()的参数列表中,width在number的前面。同样,width
和precision提供打印weight的格式化信息。下面是一个运行示例:
Enter a field width:
6
The number is : 256:
Now enter a width and aprecision:
8 3
Weight = 242.500
Done!
这里,用户首先输入6,因此6是程序使用的字段宽度。类似地,接下来
用户输入8和3,说明字段宽度是8,小数点后面显示3位数字。一般而言,程
序应根据weight的值来决定这些变量的值。
(2)、scanf()中*的用法与此不同。把*放在%和转换字符之间时,会使得
scanf()跳过相应的输出项。程序清单4.17就是一个例子。
#include <stdio.h>
int main() {
int n;
printf("Please enter threeintegers:\n");
scanf("%*d %*d %d", &n);
printf("The last integer was %d\n",n);
return 0;
}
程序清单4.17中的scanf()指示:跳过两个整数,把第3个整数拷贝给n。
下面是一个运行示例:
Please enter threeintegers:
2013 2014 2015
The last integer was2015
在程序需要读取文件中特定列的内容时,这项跳过功能很有用。