Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1775665
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

2012-03-28 17:37:50

一次一行输入由以下两个函数提供。



  1. #include <stdio.h>

  2. char *fgets(char *restrict buf, int n, FILE* restrict fp);

  3. char *gets(char *buf);

  4. 两者成功返回buf,文件结束或错误返回NULL。


两都都指明一个把行读入的缓冲区的地址。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提供:



  1. #include <stdio.h>

  2. int fputs(const char *restrict str, FILE *restrict fp);

  3. int puts(const char *str);

  4. 成功返回非负值,否则返回EOF。


函数fputs把一个null终止的字符串写入到指定的流中。末尾的null字节没有被写。注意这不必是一个一次一行输出,因为字符串最后的非null字符不必是一个换行符。虽然通常都是这种情况--最后一个非空字符为换行符--但这并不被要求。


puts函数在标准输出写一个空字符终止的字符串,但不会把这个空字节写出。不同的是puts接着会把一个换行符写入到标准输出。


puts函数并不会不安全,就像与它相当的gets一样。尽管如此,我们将避免使用它,以免记住它是否添加一个换行符。如果我们总是合适fgets和fputs,我们知道我们必须处理每行最后的换行符。

阅读(609) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~