分类: 系统运维
2012-03-28 17:37:50
一次一行输入由以下两个函数提供。
两都都指明一个把行读入的缓冲区的地址。gets函数从标准输入中读,而fgets从指定的流中读取。
使用fgets,我们必须指定缓冲的尺寸,n。这个函数一直读到并包括下一个换行符,然不会多于n-1个字符,读入缓冲区里。这个缓冲由一个null字节
终止。如果这行,包括终止的换行符比n-1长,那么只有行的一部分被返回,但缓冲总是null终止的。另一个fgets的调用会读取该行的剩余部分。
gets函数不应该被使用。问题是它不允许调用者指定缓冲大小。如果行比缓冲长的话,这会允许缓冲溢出,并覆写掉跟随在缓冲之后的内存。这个缺陷用来作为1988年的因特网蠕虫的一部分。gets的另一个区别是它不和fgets一样在buffer里存储一个换行符。
两个函数的这个处理换行符的区别可以追朔到UNIX系统的起源。Version 7的手册(1979)甚至指出“gets删除一个换行符,fgets保留它,都是以身后兼容的名义。”
尽管ISO C要求一个实现来提供gets,但还是使用fgets。
一次一行输出由fputs和puts提供:
函数fputs把一个null终止的字符串写入到指定的流中。末尾的null字节没有被写。注意这不必是一个一次一行输出,因为字符串最后的非null字符不必是一个换行符。虽然通常都是这种情况--最后一个非空字符为换行符--但这并不被要求。
puts函数在标准输出写一个空字符终止的字符串,但不会把这个空字节写出。不同的是puts接着会把一个换行符写入到标准输出。
puts函数并不会不安全,就像与它相当的gets一样。尽管如此,我们将避免使用它,以免记住它是否添加一个换行符。如果我们总是合适fgets和fputs,我们知道我们必须处理每行最后的换行符。