【问题标题】:why is while written here with no body?为什么 while 写在这里没有正文?
【发布时间】:2024-01-22 17:01:01
【问题描述】:

为什么用这段代码编写的while循环没有正文?它有什么作用? 索引和长度都是整数,我正在从 txt 文件中读取。

  // ignore alphabetical strings too long to be words
        if (index > LENGTH)
        {
            // consume remainder of alphabetical string
            while ((c = fgetc(fp)) != EOF && isalpha(c));

            // prepare for new word
            index = 0;
        }

【问题讨论】:

  • 作品的主体,在while 声明中。它会跳过文件中的字母字符。
  • why? 因为循环中没有什么可做的它有什么作用? 评论说什么:消耗剩余的字母字符串,即阅读直到找到 EOF 或非字母字符
  • 它设置'c'等于文件的内容。但是,从显示的代码来看,除了被设置为文件的值之外,c 看起来没有使用。
  • 这对老猫来说是显而易见的事实并没有使它成为一个质量差的问题。紫外线
  • 注意:int c; ....while ((c = fgetc(fp)) != EOF && isalpha(c)); 可以简化为 while (isalpha(c = fgetc(fp)));,因为 EOF 不是 alpha 并且 isalpha(EOF) 已定义。

标签: c syntax while-loop fgetc


【解决方案1】:

一旦它解析了长度为 LENGTH 的字符串,它应该忽略所有后续字符。因此,在 while 循环体中:

c = fgetc(fp)) != EOF //get c from file pointer and check if it is not EOF
isalpha(c) //and also it is an alphabet because alphabets can only make a word

如果两个条件都为真,继续解析并忽略。当您遇到字母以外的字符或只是 EOF 时,重置索引并可以转到下一行。

【讨论】:

    【解决方案2】:

    为了更好地理解发生了什么,循环可以重写如下:

    do {
        c = fgetc(fp);
    } while (c != EOF && isalpha(c)); 
    

    它从文件描述符中读取一个字符,然后检查它是字母字符还是 EOF。

    原始循环所做的是将赋值作为条件中的子表达式执行,因此将主体留空。

    【讨论】:

      【解决方案3】:

      为什么 while 写在这里没有正文?

      TL;DR - 因为它是可以编写的,并且可以满足代码的预期目的。

      详细说明,在代码中

      while ((c = fgetc(fp)) != EOF && isalpha(c));
      

      && 运算符及其属性被用作控制表达式的一部分,用于循环语句的目的。只要&& 的两个操作数的计算结果都为TRUE (1),while 中的条件检查就保持TRUE (1)。一旦它们中的任何一个不是TRUE,循环就会结束。

      为了清楚起见,直到(c = fgetc(fp)) != EOF isalpha(c) 评估为非零值 (TRUE),循环继续(主体为空)。

      fgetc()isalpha() 的主页可能会有所帮助。

      【讨论】:

        【解决方案4】:

        这个while 没有正文,因为该操作是在while 循环的condition 部分中执行的。

        如果你看到循环的条件是:

        ((c = fgetc(fp)) != EOF && isalpha(c))
        

        当第一个条件 - 即 (c = fgetc(fp)) != EOF - 被评估时,c = fgetc(fp) 被执行,它从你的文件中读取一个字节。首先检查该字节是否为EOF,表示文件结束,如果不是EOF,则检查是否为非字母字符。

        从文件中读取一个字节的操作将继续进行,直到读取到非字母字符或到达文件末尾。

        所以,这段代码的 sn-p 基本上所做的是,每当 index 变得超过 LENGTH 时,它首先读取剩余的 alphabets - 不做任何事情 - 直到读取非 alpbabet 或结束文件达到。然后将index 设置为0

        while 也可以写成不同的方式,这样它就不会有一个空的主体。但是,你看到的是C中常见的idiom

        【讨论】:

          【解决方案5】:

          评论清楚地提到了代码的用途。
          // consume remainder of alphabetical string while ((c = fgetc(fp)) != EOF && isalpha(c));

          函数fgetc 在每次调用时从文件指针fp 中读取一个字符。 在阅读时,它会跳过下一个字母序列,直到它到达某个数字为止。

          【讨论】:

            【解决方案6】:

            因此,如果您阅读fgetc 上的文档,它会说成功时将返回内部文件位置指示器当前指向的字符 或 EOF。因此,while 循环只是将 c 分配给文件中的下一个字符,检查它是否不是和 EOF 并确保它是 alpha character 并继续这样做,直到这些条件不成立。该循环可以重写为:

            int c = fgetc(fp);
            while (c != EOF && isalpha(c))
                c = fgetc(fp);
            

            【讨论】:

            • fgetc() 返回 int 而不是 char。详情请阅读fgetc。正如所写,while (c != EOF && isalpha(c)) c = fgetc(fp); 可以在 char 未签名的平台上进入无限循环。