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

C 批评我的函数从输入流中跳过k个字符,c,C,处理(应该是什么)一个简单的项目,从stdin获取输入并重新格式化以匹配输出规范。我只是想看看这里的专家对下面这个函数的看法,这个函数应该跳过k个字符直到行的末尾,除非k

处理(应该是什么)一个简单的项目,从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 }
1#包括
25整数跳过(整数计数){
26国际一级;
27 int ch;
28
29表示(i=0;计数<0 | | i

(包括用于参考的行号)

不错。如果你和我一起工作并且你写了代码,我不会要求你改变它


您可以递减
count
直到它达到零,而不是递增
i
直到它达到
count
,但这是否是一种改进还是有争议的。

不错。如果你和我一起工作并且你写了代码,我不会要求你改变它


您可以递减
count
直到它达到零,而不是递增
i
直到它达到
count
,但这是否是一种改进还是有争议的。

这段代码没有什么严重错误。但为了使这一点更加有力,我会:

  • fgetc(stdin)
    的值保存到
    int
    变量中,然后使用
    isspace()
    测试它以确保它是空的,如果不是,则报告错误。使用
    int
    而不是
    char
    ,因为
    fgetc()
    在文件末尾返回
    EOF
    ,而不能放入
    char

  • 另一个小问题是,在现代文件系统上,文件大小可能大于
    INT\u MAX
    。当
    k
    <0时,我将更改循环测试以显式测试它,而不是“伪造”
    count
    INT\u MAX

  • 总之,主循环变为:

    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 */
        }
    }
    
    intch;
    对于(i=0;k<0 | | i
    此代码没有严重错误。但为了使这一点更加有力,我会:

  • fgetc(stdin)
    的值保存到
    int
    变量中,然后使用
    isspace()
    测试它以确保它是空的,如果不是,则报告错误。使用
    int
    而不是
    char
    ,因为
    fgetc()
    在文件末尾返回
    EOF
    ,而不能放入
    char

  • 另一个小问题是,在现代文件系统上,文件大小可能大于
    INT\u MAX
    。当
    k
    <0时,我将更改循环测试以显式测试它,而不是“伪造”
    count
    INT\u MAX

  • 总之,主循环变为:

    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 */
        }
    }
    
    intch;
    对于(i=0;k<0 | | i
    我更喜欢

    if (k < 0) count = 0
    else       count = k;
    
    do {
      if(fgetc(stdin) == '\n') return 1;
      count--;
    } while (count != 0);
    
    return 0;
    
    如果(k<0)计数=0
    else计数=k;
    做{
    if(fgetc(stdin)='\n')返回1;
    计数--;
    }而(计数!=0);
    返回0;
    
    以避免使用INT_MAX。请注意,前两行也可以简单地更改为“count=k;”,并且可以将count变量更改为64位类型,以处理大于2 GB的输入

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

    我更喜欢

    if (k < 0) count = 0
    else       count = k;
    
    do {
      if(fgetc(stdin) == '\n') return 1;
      count--;
    } while (count != 0);
    
    return 0;
    
    如果(k<0)计数=0
    else计数=k;
    做{
    if(fgetc(stdin)='\n')返回1;
    计数--;
    }而(计数!=0);
    返回0;
    
    以避免使用INT_MAX。请注意,前两行也可以简单地更改为“count=k;”,并且可以将count变量更改为64位类型,以处理大于2 GB的输入


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

    就个人而言,我不会使用与
    INT\u MAX
    的比较和单独的count变量,我会减少提供的值,而不是使用
    for
    循环

    我甚至可以这样做:

    while (k < 0 || k--) {
        ...
    }
    
    while(k<0 | | k--){
    ...
    }
    
    请注意,如果
    (k<0)
    由于
    |
    运算符的短路行为,减量永远不会发生,因此除非按照
    \n
    的示例中断循环,否则将得到一个无限循环


    如果
    (k==0)
    循环将立即终止(注意:后减量而不是前减量)

    我个人不会使用与
    INT\u MAX
    和单独的计数变量的比较,我会对提供的值进行减量,而不是对
    循环使用

    我甚至可以这样做:

    while (k < 0 || k--) {
        ...
    }
    
    while(k<0 | | k--){
    ...
    }
    
    请注意,如果
    (k<0)
    由于
    |
    运算符的短路行为,减量永远不会发生,因此除非按照
    \n
    的示例中断循环,否则将得到一个无限循环


    如果
    (k==0)
    循环将立即终止(注意:后减量而不是预减量)

    批评家:您:

    带有空格的“{”更易于阅读

    有时您使用“if(expression)statement;”,有时使用“if(expression){statement;}”。我总是使用“{”<