批评我的函数从输入流中跳过k个字符

时间:2009-02-27 08:46:37

标签: c

处理(应该是)一个简单的项目,从stdin获取输入并重新格式化以匹配输出规范。我只是想看看专家在这里想到的以下函数应该跳过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 }

(包括用于参考目的的行号)

5 个答案:

答案 0 :(得分:1)

此代码没有严重错误。但为了使这个更强大,我会:

  1. fgetc(stdin)的值保存到int变量,然后对其进行测试以确保使用isspace()为空,如果没有,则报告错误。使用int而不是char,因为fgetc()会在文件末尾返回EOF,但char不适合INT_MAX

  2. 另一个小问题是,在现代文件系统上,文件大小可能大于countINT_MAX&lt; k时,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 */ } } {{1}}的{​​{1}}值不是伪造的。 0,我会改变循环测试以明确地测试它。

  3. 总之,主循环变为:

    {{1}}

答案 1 :(得分:0)

不错。如果您和我合作并且您编写了该代码,我不会要求您更改它。

你可以递减count直到它达到零,而不是递增i直到它达到count,但这是否可以改善是否有争议。

答案 2 :(得分:0)

我更喜欢

if (k < 0) count = 0
else       count = k;

do {
  if(fgetc(stdin) == '\n') return 1;
  count--;
} while (count != 0);

return 0;

避免使用INT_MAX。请注意,前两行也可以简单地更改为“count = k;”并且您可以将计数变量更改为64位类型以处理输入&gt; 2 GB。

如果您有大量输入,您还可以尝试将整行甚至整个文件读入缓冲区并将指针传递给跳过函数以提高性能。

答案 3 :(得分:0)

就个人而言,我不会使用与INT_MAX的比较和单独的计数变量,并且我会减少提供的值而不是使用for循环。

我甚至可以这样做:

while (k < 0 || k--) {
    ...
}

请注意,如果(k < 0)由于||运算符的短路行为而永远不会发生减量,那么除非根据{{1}的示例跳出循环,否则将获得无限循环}

如果\n循环将立即终止(nb:后递减而不是预递减)

答案 4 :(得分:0)

评论家:你格式化:

“){”两者之间的空格更具可读性

有时您使用“if(表达式)语句”;有时候“if(表达式){statement;}”。我会一直使用“{”。

“while(”,“if(”也在关键字后面加一个空格。