为什么写在这里没有身体?

时间:2016-08-09 18:29:43

标签: c syntax while-loop fgetc

为什么在这段代码中写入的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;
        }

6 个答案:

答案 0 :(得分:3)

为了更好地了解正在发生的事情,可以按如下方式重写循环:

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

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

原始循环正在执行的操作是将条目作为子表达式执行,以便将正文留空。

答案 1 :(得分:3)

一旦解析了长度 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 :(得分:2)

  

为什么写在这里没有身体?

TL; DR - 因为,它可以被编写,并且它符合代码的预期目的。

详细说明,在代码中

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

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

为了清楚,直到(c = fgetc(fp)) != EOF isalpha(c)评估为非零值(TRUE),循环才会(使用空体)。

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

答案 3 :(得分:1)

while编写时没有正文,因为操作是在condition循环的while部分执行的。

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

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

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

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

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

虽然也可以用不同的方式书写,所以它不会有空身。但是,您看到的是idiom中常见的C

答案 4 :(得分:0)

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

每次调用时,函数fgetc从文件指针fp中读取一个字符。 在阅读时,它会跳过下一个字母序列,直到它达到数字之外的其他内容。

答案 5 :(得分:0)

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

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