对于使用DEV C过程中曾经出现的一些问题的总结(一):
I/O printf和scanf函数输入输出时一些问题:
1:&,*的使用:
学习c语言之初,经常被强调在<stdio.h>下的scanf函数使用时要使用取地址符&,而对于数组类型,数组名前则不需要加&。如下:
/* 正确的输入输出: /
出现这种情况的原因是C语言本身决定的,因为对于scanf函数输入过程是将数据存入相应的存储地址中,因此对任何数据都是对其取地址赋值的。而对于字符串而言,其本身的字符名就表示该字符串的首地址,即s=&s[0]是等价的因此不需要加取地址符&。
当printf函数输出时,对于字符串s,如果按%c输出字符串中某个字符时,可以利用数组元素直接输出,同时也可以利用指针的方法:比如s即为字符串的首字符。(由此也可见,&,*为一对互逆运算)
当不添加取地址符&时,DEV C不会提示编译错误,但运行过程将不会通过:
同时,当输入多个类型的数据的时候,&应加在相对应的需要添加取地址符的类型之前,一个&不能通用于之后的所有数据(*因为曾经有过投机取巧的想
法*),否则同样将出现上述运行出错的情况:
2:对于输入输出的位数的控制:
当希望通过c语言输出位数不同的函数,或使输出数据更加整齐时,通常需要使用到对输出结果的位数进行控制。
对于printf函数,输出时可以通过以下方式改变输出位数:
当输出按%5d时意味着,输出时按5位依次输出最后一位数与左端相隔五个字符距离,位数不够按空格补齐(当单个数a位数超过五位时,则数据不会覆盖,
a,b按形式一次输出,不出现空格效果)
输出结果如下:
类似的,当数字5发生改变时意味着输出所控制的位数发生改变,当其为负值时,即方向改变,整个数字向左靠拢:
以上方法同样适用于字符串的输出。
对于浮点数,可以采用小数的形式来使输出结果整数部分和小数部分的位数,如下图(正数部分为三位,小数部分为两位):
实际情况下,整数部分不做限制,而小数部分会通过四舍五入严格按位数输出。
那么对于scanf函数是否有同样的方式呢?
scanf函数在输入过程中是不能企图通过上述方式来控制位数的,但其同样有类似的方式来表示其他含义:
通过一个例子进行说明:
可见scanf函数添加数字表示按严格按位数录入数字,当数字超过所取位数时,舍弃多余的数据。%*3d在此处也可看出,表示录取数据时跳过的位数。当位数不足时,输出数据为0。
3:输入过程的一个不易发现错误:
以前经常出现的一个错误:
DEV C对此不会提示编译错误,但输入之后不显示结果。
输入过程不需要通过转义字符来进行换行操作,因为scanf本身在遇空格或回车时便停止。