printf,scanf函数详解

高手帮我说下,printf,scanf函数详解
最新回答
情根深种

2025-03-02 08:07:18

C语言篇

主要介绍的具体知识有

第一大点:

printf(),scanf()这两个最常用的函数(据学长经验,这是两个很多人都不会用的,或者说没用到位的最基本的函数)

printf(),

(1)f代表着格式化输出的意思,意思是通过使用格式化字符串(format string)作为函数参数来指定具体格式

(2)格式化字符串定义了数据的输出格式,并包含了一些普通字符和转换说明。每个转换说明都定义了函数该如何将可选参数转换并格式化,以供输出.(转换说明以百分号 % 开始,并以一个字母结尾,这称为转换修饰符)

(3)所有的转换说明(但 %% 是例外)都具有下面的通用格式:

%[标记][字段宽度][.精度][长度修饰符]修饰符

(4)所有转换说明都可包含“字段宽度”(field width)。然而,并非所有的转换类型都有“精度”(precision)这个选项,对不同的修饰符来说,精度意义是不一样的。

举个例子:

对于字符串,精度指定的是能被输出的最多字符数量

字段宽度

进行格式化的表格输出时,字段宽度选项非常有用。如果包括该选项,字段宽度必须是正的十进制整数。字段宽度指定对应的数据项所输出的最少字符数量。默认情况下,字段中的被转换数据为右对齐(right-justified),左边多的位置用空格填补。如果标记包含减号(-),则为左对齐(left-justified),超出的字段宽度采用空格向右填补。 下面的例子先输出一行位置编号,然后展示字段宽度选项对输出的作用:

1. printf("1234567890123456 "); // 字符位置

2. printf( "%-10s %s ", "Player", "Score" ); // 表头

3. printf( "%-10s %4d ", "John", 120 ); // 字段宽度:10;4

4. printf( "%-10s %4d ", "Mary", 77 ); 上述语句会生成一个简单表格:

1234567890123456 Player Score John 120 Mary 77

如果输出转换的结果比所指定的宽度具有更多的字符,那么字段会做必要的扩充,以输出完整的数据。

输出字符和字符串

printf()中针对字符串的转换修饰符是 s,正如前面代码中所示。针对字符的修饰符是 c(表示 char)。它们总结如表 1 所示。

用转换说明 %c 表示的参数,可以拥有比 int 还小的类型(例如 char)。整数提升会自动地将该类型参数转换成 int。然后函数 printf()将该 int 参数转换为 unsigned char,并输出对应的字符。 对于字符串输出来说,可以指定能被输出的最多字符数量。这时用到转换说明的精度选项,精度表示为一个点后接一个十进制整数。如下例所示:

输出整数

函数 printf()可以把整数值转换为十进制、八进位或十六进制表示。表 2 列出了用于格式化输出整数的转换修饰符。

下面的例子展示同一个整数的不同转换方式:

修饰符 u、o、x 与 X 把对应的参数解释为无符号整数。如果参数类型是 int,并且其值是负数,则转换后输出的是对应参数按照无符号整数解释时其位模式下的正数值:

如果 int 为 32 位宽,那么该语句会产生下面的输出:

-1 4294967295 FFFFFFFF 因为参数会受到整数提升的影响,同样的转换修饰符可以被用来格式化 short 和 unsigned short 参数。对于类型是 long 或 unsigned long 的参数,必须在 d、i、u、o、x 和 X 修饰符前面加上长度修饰符 l(小写的 L)。类似地,如果参数是 long long 或 unsigned long long 类型,则其长度修饰符是 ll(两个小写 L)。

输出浮点数

表 3 列出了函数 printf()用来格式化输出浮点数的转换修饰符。

最常用的修饰符是 f 和 e(或 E)。下面的例子展示了它们的用法:

1. double x = 12.34;

2. printf( "%f %e %E ", x, x, x );

该 printf()调用将产生下面的输出:

12.340000 1.234000e+01 1.234000E+01

在指数表示法中出现的 e 是大写还是小写,取决于函数转换修饰符中所用 e 的大小写。而且,如上例所示,默认输出显示精度为 6 位小数。转换修饰符中的精度选项可修改这个默认设置:

控制浮点数精度的例子:

正如上例所示,printf()会将浮点数按向上或向下取近似值,以便于输出。如果指定精度为0,那么小数点本身则会被省略。如果仅仅想把小数部分直接去掉,而不是取近似值,直接将它转换为整数类型可达到目的。

Printf()函数常见的一些错误。

该函数是根据转换说明,而不是根据变量类型从内存中读取值。

在打印的过程中,转换说明,n1,n2,n3,n4都是作为参数传递给printf函数的,在外部, ,n1,n2,n3,n4的地址空间是随机的,不连续的,但在传入函数后,它们的形参空间是连续的

下面是scanf函数:

Scanf函数的用法和printf非常相似,他们就像一对孪生兄弟,熟练掌握了printf(),那么scanf就不在话下,下面就简单介绍一些使用scanf()函数的易错点。

使用scanf函数还必须注意以下几点:

例如:

3.在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束

1. scanf("%c%c%c",&a,&b,&c);

输入 d、e、f 则把'd'赋予a,' ' 赋予b,'e'赋予c。只有当输入为 def 时,才能把'd'赋于a,'e'赋予b,'f'赋予c。 如果在格式控制中加入空格作为间隔,如:

1. scanf ("%c %c %c",&a,&b,&c);

则输入时各数据之间可加空格。

如果格式控制串中有非格式字符则输入时也要输入该非格式字符。

1. scanf("%d,%d,%d",&a,&b,&c);

其中用非格式符“ , ”作间隔符,故输入时应为:5,6,7。又如:

1. scanf("a=%d,b=%d,c=%d",&a,&b,&c);

则输入应为:a=5,b=6,c=7。