Chinaunix首页 | 论坛 | 博客
  • 博客访问: 328224
  • 博文数量: 57
  • 博客积分: 146
  • 博客等级: 入伍新兵
  • 技术积分: 769
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-29 14:57
文章分类
文章存档

2014年(39)

2013年(13)

2012年(5)

我的朋友

分类: C/C++

2014-07-23 10:56:10

一.总是检查这些输入/输出函数的状态并适当地处理错误。
错误地检测和处理特定的输入/输出错误可能导致未定义的程序行为。



错误代码:

点击(此处)折叠或打开

  1. char buf[1024];
  2. fgets(buf, sizeof(buf), fp);
  3. buf[strlen(buf) - 1] = '\0'; /* Overwrite newline */
 fgets()函数不区分文件尾和错误,调用者必须使用feof()和ferror()来确定错误还是读到文件尾。若fgets失败,其buf的内容根据产生的错误来确定是未改变还是模糊不确定。

点击(此处)折叠或打开

  1. char buf[BUFSIZ];
  2. int ch;
  3. char *p;
  4. if (fgets(buf, sizeof(buf), stdin)) {
  5. /* fgets succeeds, scan for newline character */
  6. p = strchr(buf, '\n');
  7. if (p) {
  8. *p = '\0';
  9. }
  10. else {
  11. /* newline not found, flush stdin to end of line */
  12. while (((ch = getchar()) != '\n') && !feof(stdin) && !ferror(stdin) );
  13. }
  14. }
  15. else {
  16. /* fgets failed, handle error */
  17. }

二.使用feof()和ferror()来判断文件尾和文件错误
C99规定,不能保证能区分开EOF字符与普通字符。因此,使用feof函数和ferror函数来判断文件尾和文件错误。
getchar()/fgetc()/getc()不仅是遇到文件结尾时返回EOF,而且当发生错误时,也会返回EOF.
错误代码:

点击(此处)折叠或打开

  1. int c;
  2. do {
  3. /* ... */
  4. c = getchar();
  5. /* ... */
  6. } while (c != EOF)

正确代码:

点击(此处)折叠或打开

  1. int c;
  2. do {
  3. /* ... */
  4. c = getchar();
  5. /* ... */
  6. } while (!feof(stdin) && !ferror(stdin))

三.谨慎从无边界限制的输入源(列如,STDIN)拷贝数据到固定大小限制的缓冲区

错误代码:

点击(此处)折叠或打开

  1. char buf[10];
  2. scanf("%s", buf)

正确代码:

点击(此处)折叠或打开

  1. char buf[10];
  2. scanf("%9s", buf)






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