一.总是检查这些输入/输出函数的状态并适当地处理错误。
错误地检测和处理特定的输入/输出错误可能导致未定义的程序行为。
错误代码:
-
char buf[1024];
-
fgets(buf, sizeof(buf), fp);
-
buf[strlen(buf) - 1] = '\0'; /* Overwrite newline */
fgets()函数不区分文件尾和错误,调用者必须使用feof()和ferror()来确定错误还是读到文件尾。若fgets失败,其buf的内容根据产生的错误来确定是未改变还是模糊不确定。
-
char buf[BUFSIZ];
-
int ch;
-
char *p;
-
if (fgets(buf, sizeof(buf), stdin)) {
-
/* fgets succeeds, scan for newline character */
-
p = strchr(buf, '\n');
-
if (p) {
-
*p = '\0';
-
}
-
else {
-
/* newline not found, flush stdin to end of line */
-
while (((ch = getchar()) != '\n') && !feof(stdin) && !ferror(stdin) );
-
}
-
}
-
else {
-
/* fgets failed, handle error */
-
}
二.使用feof()和ferror()来判断文件尾和文件错误
C99规定,不能保证能区分开EOF字符与普通字符。因此,使用feof函数和ferror函数来判断文件尾和文件错误。
getchar()/fgetc()/getc()不仅是遇到文件结尾时返回EOF,而且当发生错误时,也会返回EOF.
错误代码:
-
int c;
-
do {
-
/* ... */
-
c = getchar();
-
/* ... */
-
} while (c != EOF)
正确代码:
-
int c;
-
do {
-
/* ... */
-
c = getchar();
-
/* ... */
-
} while (!feof(stdin) && !ferror(stdin))
三.谨慎从无边界限制的输入源(列如,STDIN)拷贝数据到固定大小限制的缓冲区
错误代码:
-
char buf[10];
-
scanf("%s", buf)
正确代码:
-
char buf[10];
-
scanf("%9s", buf)
阅读(699) | 评论(0) | 转发(0) |