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

标签 c

<分区>

从事(应该是)一个简单的项目,从标准输入中获取输入并重新格式化以匹配输出规范。我只是想看看这里的专家如何看待以下应该跳过 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 }

(包括行号以供引用)

最佳答案

这段代码没有什么严重的错误。但是为了让它更健壮,我会:

  1. fgetc(stdin) 的值保存到一个 int 变量中,然后使用 isspace()< 测试它以确保它是一个空白,如果没有则报错。使用 int 而不是 char 因为 fgetc() 在文件末尾返回 EOF,这不能放在字符.

  2. 另一个小问题是,在现代文件系统中,文件大小可能大于 INT_MAX。当 k < 0 时,我不会“伪造” INT_MAXcount 值,而是更改循环测试以显式测试它。

综上所述,主循环变为:

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 */
    }
}

关于批评我从输入流中跳过 k 个字符的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/594006/

相关文章:

c - 为什么fork程序printf执行时间更长

c - 序言功能的差异

C:如何同时链接不同的库版本

python - 如何在 Python C API 中定义类方法?

c++ - 多边形中的内部点

c - 用单个字符声明整个字符串

c++ - VTK IO 的 C/C++ 库

c - 灵活的数组成员真的有必要吗?

c - 在多个头文件和源文件中组织 C 语言变量和函数时出现警告

c - 难以理解 MPI_Type_create_struct