基本输入和输出操作
与大多数现代编程语言一样,C语言也没有输入输出的能力,所有这类操作都由标准库中的函数提供。
stderr
流只是将来自C库的错误信息传送出去,也可以将自己的错误信息传送给stderr
。
stderr
和stdout
之间的主要差别是,输出到stdout
的流在内存上缓存,所以写入stdout
的数据不会马上送到设备上,而stderr
不缓存,所以写入到stderr
的数据会立刻传送到设备上。
对于缓存的流,程序会在内存中传入或传出缓存区域的数据,在物理设备上传入或传出数据可以异步进行。这使输入输出比较高效,而为错误信息使用不缓存的流,其优点是可以确保错误信息显示出来,但输出操作是低效的。缓存的流比较高效,但是如果程序因某种原因失败,缓存的流就不会刷新,所以输出可能永远不会显示出来。
scanf
会忽略空白字符
scanf
和printf
中有个格式控制符%n
:表示输出有效字符的数量。
N多的scanf
参数也可以保证,你可以用许多方式得到自己希望得到的数据。
但是有一点需要注意,就是scanf
对输入格式很挑剔,稍微错一点就会导致整个读取输入出错。
scanf
的格式控制符%s
只能读取不含空格的字符串,但是%[]
可以读取包含空格的字符串,比如I love you,就可以全部读取。
scanf
的陷阱
- 变元必须是指针,最常犯的错误是将变量指定为scanf的变元时,忘记在变量名的前面加上&符号,不过使用printf时不需要这个&字符,此外,如果变元时数组名或指针变量,也不需要&符号;
- 在读字符串时,要确保有足够的空间存放读入的字符串,这个字符串需包含终止字符’\0’,否则,会覆盖内存中的饿数据,甚至是程序代码。
对于字符串输入,使用gets或fgets通常是首选方式,除非要控制字符串的内容。