C-嵌套while循环中的Getchar导致无限循环
我目前正在尝试计算文本文件中不包括行注释(如//comment)的字符数,因此我尝试识别注释的开头(//),并使用while循环读取注释,直到遇到EOF或新行字符,因此我知道注释已结束。问题是,当我使用double while loop()过滤掉行注释时,它会导致一个无限循环,因为它不会退出内部while循环。这是我的密码。有人知道为什么会这样吗?我被难住了C-嵌套while循环中的Getchar导致无限循环,c,C,我目前正在尝试计算文本文件中不包括行注释(如//comment)的字符数,因此我尝试识别注释的开头(//),并使用while循环读取注释,直到遇到EOF或新行字符,因此我知道注释已结束。问题是,当我使用double while loop()过滤掉行注释时,它会导致一个无限循环,因为它不会退出内部while循环。这是我的密码。有人知道为什么会这样吗?我被难住了 int numChars = 0; int c = 0; int prevc = 0; while ((c = getchar()) !
int numChars = 0;
int c = 0;
int prevc = 0;
while ((c = getchar()) != EOF) {
if (c == '/' && prevc == c) {
while (c != '\n' || c != EOF) {
c = getchar();
}
}
numChars++;
prevc = c;
}
例如,如果文本文件包含//Hello,它应该输出0个字符,而如果文本文件包含Hello,它应该输出5个字符。
c!='\n'| | c!=EOF
始终为真
只有当两个条件都为false时,它才可能为false,这意味着c=='\n'
和c==EOF
都为true。显然,这两者不可能都是真的(除非EOF
与'\n'
相同,事实并非如此)
您需要使用
&&
,而不是|
c!='\n'| | c!=EOF
始终为真
只有当两个条件都为false时,它才可能为false,这意味着c=='\n'
和c==EOF
都为true。显然,这两者不可能都是真的(除非EOF
与'\n'
相同,事实并非如此)
您需要使用
&&
,而不是|
此语句始终正确
while (c != '\n' || c != EOF)
因此有一个无限循环。这句话总是正确的
while (c != '\n' || c != EOF)
因此产生了一个无限循环。我将它改为c!='\n’&c!=EOF但由于某种原因,在//Hello的输入上,numchars仍然是1,但它应该是0,因为我忽略了所有注释。你知道这是为什么吗?@wanderingstu:因为你数的是换行符。我认为这是正确的;计数应该是1。但我想这取决于作业中的精确要求。但我认为它应该是0,因为在这种情况下,我只是键入一条注释,末尾没有换行符。是这样吗?@wanderingstu:你怎么在没有换行符的情况下输入评论?你没有在评论的末尾按回车键吗?如果您将输入放入一个文件中,几乎肯定会在末尾有一个换行符(使用
hd
查看文件的精确内容。)@wanderingstu如果您不希望“没有换行符的注释”不计算在内,请不要让代码继续执行numChars++;prevc=c当检测到EOF
时,我将其更改为c!='\n’&c!=EOF但由于某种原因,在//Hello的输入上,numchars仍然是1,但它应该是0,因为我忽略了所有注释。你知道这是为什么吗?@wanderingstu:因为你数的是换行符。我认为这是正确的;计数应该是1。但我想这取决于作业中的精确要求。但我认为它应该是0,因为在这种情况下,我只是键入一条注释,末尾没有换行符。是这样吗?@wanderingstu:你怎么在没有换行符的情况下输入评论?你没有在评论的末尾按回车键吗?如果您将输入放入一个文件中,几乎肯定会在末尾有一个换行符(使用hd
查看文件的精确内容。)@wanderingstu如果您不希望“没有换行符的注释”不计算在内,请不要让代码继续执行numChars++;prevc=c检测到EOF
时的代码>。