关于printf()函数和scanf()函数的解析

printf()函数和scanf()函数能让用户可以与程序交流,它们是输入/输出函数,简称I/O函数。
虽然printf()函数是输出函数,scanf()函数是输入函数,但是它们的工作原理几乎相同。两个函数都使用格式控制字符串和参数列表。我们先介绍printf(),再介绍scanf()函数。

  1. *printf()函数*
    

请求printf()函数打印数据的指令要与待打印数据的类型相匹配。例如,打印整数的%d,打印字符时使用的%c。这些符号被称为转换说明(conversion specification),它们指定了如何把数据转换成可显示的形式。
下面列出一些常用的转换说明及其打印的输出结果:

%c——单个字符 
%d——有符号的十进制整数
%f——浮点数,十进制计数法
%p——指针
%s——字符串
%x——无符号十六进制整数,使用十六进制数0f
%%——打印一个%
  1.  这是printf()函数的格式:printf(“格式字符串”,待打印项1,待打印项2,.....);
    

待打印项1,待打印项2等都是要打印的项。它们可以是变量,常量,甚至是在打印之前先要计算的表达式。格式字符串应该包含每一个待打印项对应的转换说明。例如,考虑下面的语句:

**printf(“The %d contestants are %f berry pies.\n”,numbers,pies);**

格式字符串是双引号括起来的内容。上面语句的格式字符串包含了两个待打印项number 和pies对应的两个转换说明。
警告:
格式字符串中的转换说明一定要与后面的每个项相匹配,若忘记这个基本要求会导致严重的后果,千万不要写成下面这样:
printf(“The score was Squids %d,Slugs %d.\n”,scores1);
这里,第2个%d没有对应任何项,系统不同,导致的结果也不同。不过,出现这种问题最好出现无意义的垃圾值。
如果只打印短语或者句子,就不需要使用任何转换说明。如果只打印数据,就不用加入说明文字。
由于printf()函数使用%符号来标识转换说明,因此打印%符号就成个问题,如果单独使用一个%符号,编译器会认为漏掉一个转换字符。解决方法很简单,使用两个%符号就好了:

**pc=2*6;
printf(“Only %d%% of Sally’s gribbles were edibls.\n”,pc);**

下面是输出结果:

Only 12% of Sally’s gribbles were edibles.
  1. printf()的转换说明修饰符
    

在%和转换字符之间插入修饰符可修饰基本的转换说明:
数字——最小字段宽度,如果该字段不能容纳待打印的数字或字符串,系统会使用更宽的字段,示例:“%4d”
. 数字(ps:数字前面有个点)——精度,
注意:float参数的转换
对于浮点类型,有用于double和long double类型的转换说明,却没有float类型的,这是因为在K&R C中,表达式或参数中的float类型值会被自动转换成double型。
printf()函数中的标记:
“-”——待打印项左对齐。即,从字段的左侧开始打印该项。 示例:“%-20s”
“+”——有符号值若为正,则在值前面显示加号;若为负,则在值前面显示减号。示例:“%+6.2f”
“空格”——有符号若为正,则在值前面显示前导空格(不显示任何符号);若为负,则在值前面显示减号 示例:“% 6.2f”
“#”——把结果转换为另一种形式,如果是%o格式,则以0开始;如果是%x或者%X格式,则以0x或0X开始;对于所有的浮点格式,#保证了即使后面没有任何数字,也打印一个小数点字符。对于%g和%G格式,#防止结果后面的0被删除。示例:“%#o”,“%#8.0f”。
“0”——对于数值格式,用前导0代替空格填充字段宽度,对于整数格式,如果出现-标记或指定精度,则忽略该标记。 示例:“%010d”和“%0.8f”
例:/flags.c—演示一些格式标记/

**#include <studio.h>
int main(void)
{
  printf(“%x %X %#x\n”,31,31,31);
  printf(“**%d**% d**% d”,42, 42,-42);
  printf(“**%5d**%5.3d**%05d**%05.3d**\n”,6,6,6,6);
  return 0;
}**

该程序的输出如下:

 1f 1F 0x1f
 **42** 42**-42**
 **     6**   006**00006**       006**

第1行输出中,1f是十六进制数,等于十进制数31.第一行printf()语句中,根据%x打印出1f,%X打印出1F,%#x打印出0x1f。
第2行输出演示了如何在转换说明中用空格在输出的正值前面生产前导空格,负值前面不产生前导空格。这样的输出结果比较美观,因为打印出来的正值和负值在相同字段宽度下的有效数字位数相同。
第3行输出演示了如何让在整型格式中使用精度(%5.3d)生成足够的前导0以满足最小位数的要求(本例是3)。然而0标记会使得编译器用前导0填充整个字符宽度。最后,如果0标记和精度一起出现,0标记会被忽略。
4. 下面看看字符串格式的示例:

**/*stringf.c—字符串格式*/
#include <studio.h>
#define BLURB “Authentic imitation!”
int main(void)
{
     printf(“[%2s]\n”,BLURB);
     printf(“[%24s]\n”,BLURB);
     printf(“[%24.5s]\n”,BLURB);
     printf(“[%-24.5s]\n”,BLURB);
    return 0;
}**

该程序的输出如下:

[Authentic imitation!]
[          Authentic imitation!] 
[                                 Authe]
[Authe                                 ]

注意,虽然第一个转换说明是%2s,但是字段被扩大为可容纳字符串中的所有字符。还需注意,,精度限制了待打印字符的个数。.5告诉printf()只打印5个字符。另外,-标记使得文本左对齐输出。

ps:关于scanf()函数将分另一张详细讲解!

猜你喜欢

转载自blog.csdn.net/qq_43656353/article/details/86736868