2013-10-02 79 views
1

我在做K & R書。 如果我檢查一個==,那麼一切正常,但如果我檢查!=,則不打印直方圖。 這工作來自K&R的Exersice 1-13

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(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; 
} 

回答

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') 
+1

'if(state = IN)'也是錯的 –

+0

基本上我想要一個過濾器。如果你不是一個空間,進入正確的位置,那麼如果你不是一個標籤來進一步等等? – aamermoquim

+0

@aamermoquim;我不明白你與什麼混淆? – haccks

1

如果你否定整體,如果stament嘗試,如果((三== '' ||ç== '\ t' || C = ='\ n'))或其邏輯等價項if(c!=''& & c!='\ t'& & c =='\ n'))。否定個人元素是不夠的。你必須改變或者是和。

+0

好的。這是爲什麼? – aamermoquim

+0

參見[http://en.wikipedia.org/wiki/Negation](http://en.wikipedia.org/wiki/Negation)和[http://en.wikipedia.org/wiki/De_Morgan%27s_laws] (http://en.wikipedia.org/wiki/De_Morgan%27s_laws) –

0

每一個字符是「沒有空間」 ,「不是標籤」或「不是換行符」。例如,一個選項卡是「不是空格」和「不是換行符」。所以,如果條件永遠不會是錯誤的。這聽起來像你想要尋找「不是空格」和「不是標籤」和「不是換行符」的字符。

+0

這是完全正確的。如果我給這個代碼提供tab然後不是空格,那麼這將是真實的,並且該語句會執行(短路)。所需要的是逐個檢查每個條件。如果它不是一個製表符,它是一個空格,如果不是它,它仍然是一個換行符,如果沒有那麼我們想要它。這是&&不||的工作。 – aamermoquim