您的位置:首页 > 其它

printf&scanf的使用注意事项

2016-07-14 09:35 387 查看
1、 格式化说明符:

格式化说明符与printf()函数中的格式说明符基本相同。但和printf()函数中格式字符串的用法有一些小区别。可查c primer plus 的68页以及79页。

scanf:注意事项

(1) 对于字符串数组或字符串指针变量,由于数组名和指针变量名本身就是地址,因此使用scanf()函数时,不需要在它们前面加上”&”操作符。

(2) 可以在格式化字符串中的”%”各格式化规定符之间加入一个整数,表示任何读操作中的最大位数。

如上例中若规定只能输入10字符给字符串指针p,则第一条scanf() 函数语句变为:scanf(“%10s”, p);

程序运行时一旦输入字符个数大于10,p就不再继续读入,而后面的一个读入函数即scanf(“%s”, str)就会从第11个字符开始读入。

这里就涉及到垃圾的产生,要使用getchar()函数。

(3) scanf()函数中没有精度控制。

如: scanf(“%5.2f”,&a); 是非法的。不能企图用此语句输入小数为2位的实数。

(4) scanf中要求给出变量地址,如给出变量名则会出错

如 scanf(“%d”,a);是非法的,应改为scnaf(“%d”,&a);才是合法的。

(5) 在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。

C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。

(6) 在输入字符数据(%c)时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。

例如:scanf(“%c%c%c”,&a,&b,&c);

输入为:

d e f

则把’d’赋予a, ’ (空格)’赋予b,’e’赋予c。因为%c 只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此把’ ‘作为下一个字符送给b。

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

如 scanf (“%c %c %c”,&a,&b,&c);则输入时各数据之间可加空格。

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

例如:

scanf(“%d,%d,%d”,&a,&b,&c); 其中用非格式符“ , ”作间隔符,故输入时应为: 5,6,7 (与scanf 双引号之间的格式必须一样)

又如: scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);

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

如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。

printf:注意事项

函数printf从左往右读取,然后将先读取放到栈底,最后读取的放在栈顶,处理时候是从栈顶开始的,所有我们看见的结果是,从右边开始处理的。

(PS:这段话有书上不赞同,但一般可以这么用着)

例:

vc

1.

include

include “stdafx.h“

void main()

{

int a=3;

printf(“%d,%d/n”,a,(a-=a*a));

}

2.

include

include “stdafx.h“

void main()

{

int a=3;

printf(“%d,%d/n”,(a-=a*a),a);

}

1的输出-6,-6

2的输出3,-6

今天弟弟问了一道题,问输出是什么:

int a = 8;

int b = 8;

printf(“%d, %d/n”, (a++, ++b), b–);——-语句1

printf(“%d, %d/n”, b–, (a++, ++b));——-语句2

(注:语句1和语句2是分开执行的,即它们分属于两个不同的主函数)

囧,居然给初学者出这样的题,这不是要把人吓跑么……

分析一下知识点,做这道题需要三个知识点:

1)逗号表达式的值

2)前置++和后置++的区别

3)printf函数的参数求值顺序——囧,这个就是难点了

对于1),逗号表达式的值是最右边的一个;

对于2),前置++是在本条语句执行之前++,后置++是在本条语句执行之后++;

对于3),据说跟编译器相关,C语言没有规定参数压栈顺序和求值顺序,但我所见过的编译器都是自右向左求值的(呃,见过的比较少,TC、VC6.0、vs2005,gcc)。

(函数是从右边开始传参的)

依照上面的规则来分析语句1:

printf(“%d, %d/n”, (a++, ++b), b–);——-语句1

1、由于printf的参数是从右往左求值的,所以它第一个传参是传b–,但由于是后置的–,所以这个–现在并没有执行,所以输出的是b的初始值8;

2、然后再看参数(a++, ++b),此时表达式结果是++b的值,由于是前置的++,所以这个++立即执行,输出的是9;

3、在输出完毕后,b再执行–,b的值又变成8……

所以语句1结果输出是9,8

用同样的规则分析语句2:

printf(“%d, %d/n”, b–, (a++, ++b));——-语句2

得到的结果是9,9

????

在vs2005下运行,结果与分析所得一致。

规则:1、++i替换成变量名

2、i++替换成数值

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