我在做K& R书。 如果我检查一个==然后一切正常但如果我检查!=,那么就不会打印直方图。 这工作
while( (c = getchar()) != EOF )
{
if(c == ' ' || c == '\t' || c =='\n')
{
state = OUT;
if(wc>0)
++numOfWords[wc];
wc = 0;
}
else
if(state == OUT)
state = IN;
if(state = IN)
++wc;
}
但是将if部分更改为:
if(c != ' ' || c != '\t' || c !='\n'){
if(state == OUT){
state = IN;
++wc;}
else
++wc;
}
else
{
state = OUT;
if(wc>0)
++numOfWords[wc];
wc = 0;
}
}
我希望每个字符都不是制表符,空格或换行符。所以我写了c != '\t' || c!= ' ' || c!= '\n'.
,我的意思是
If c is not (!=) space(' ') then its 1(true) OR(||) if c is not (!=) tab('\t') then its 1 OR(||) ...so on.
如果OR语句中的任何一个为真,则整个语句为真,并且正在执行,那么为什么不执行呢?
感谢您注意到第一个片段中的拼写错误,我更正了,但我想问一下,为什么第二个代码段不起作用?
答案: 这非常有效:
if(c != ' ' && c != '\t' && c !='\n' && c != '"' && c!= '.' && c != ','){
if(state == OUT){
state = IN;
++wc;}
else
++wc;
}
else
{
state = OUT;
if(wc>0)
++numOfWords[wc];
wc = 0;
}
答案 0 :(得分:1)
如果你要否定整个if stament try if(!(c ==''|| c =='\ t'|| c =='\ n'))或其逻辑等价如果(c! =''&& c!='\ t'&& c =='\ n'))。否定个人因素是不够的。你必须将或更改为和。
答案 1 :(得分:1)
在第一个片段中
if(state = OUT)
...
if(state = IN)
错了。将其更改为
if(state == OUT)
...
if(state = IN)
之后,如果您的第一段代码运行良好,请更改
if(c != ' ' || c != '\t' || c !='\n')
在你的第二个片段中
if(c != ' ' && c != '\t' && c !='\n')
答案 2 :(得分:0)
每个字符都是“不是空格”,“不是标签”或“不是换行符”。例如,选项卡是“不是空格”和“不是换行符”。所以if-condition永远不会是假的。听起来你想要寻找“不是空格”和“不是标签”和“不是换行符”的字符。