printf&scanf的使用注意事项

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替换成变量名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值