从事(应该是)一个简单的项目,从标准输入中获取输入并重新格式化以匹配输出规范。我只是想看看这里的专家如何看待以下应该跳过 k 个字符直到行尾的函数,除非 k < 0,它将继续跳过字符直到到达换行符。
1 #include <stdio.h>
25 int skip(int count){
26 int i;
27 int ch;
28
29 for(i = 0; count < 0 || i < count; i++){
30 ch = fgetc(stdin);
31 if(ch == EOF){
32 return -1;
33 }
34 if(ch == '\n'){
35 return 0;
36 }
37 }
38 return 1;
39 }
(包括行号以供引用)
这段代码没有什么严重的错误。但是为了让它更健壮,我会:
将 fgetc(stdin)
的值保存到一个 int
变量中,然后使用 isspace()< 测试它以确保它是一个空白
,如果没有则报错。使用 int
而不是 char
因为 fgetc()
在文件末尾返回 EOF
,这不能放在字符
.
另一个小问题是,在现代文件系统中,文件大小可能大于 INT_MAX
。当 k
< 0 时,我不会“伪造” INT_MAX
的 count
值,而是更改循环测试以显式测试它。
综上所述,主循环变为:
int ch;
for (i = 0; k < 0 || i < k; ++i) {
ch = fgetc(stdin);
if (ch == '\n') {
return 1;
} else if (ch == EOF) {
return -1; /* Or some error code of your choice */
} else if (!isspace(ch)) {
return -2; /* Or some error code of your choice */
}
}