为什么在这段代码中写入的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;
}
答案 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),循环才会(使用空体)。
答案 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);