2011-05-16 60 views
5

一個程序在每行輸出一個字的輸入。無法計算出C程序中的邏輯錯誤

int main() { 

    int c; 

    while ((c=getchar()) != EOF) { 

     if (c== ' ' || c== '\n' ||c == '\t') 
       putchar('\n'); 
     else { 
      putchar(c); 
     } 
    } 
    return 0; 
} 

上述程序正確輸出結果,每行一個字。在相應地改變條件之後,我期待下面的程序每行打印一個字。但是我沒有得到正確的結果。我犯了一些愚蠢的錯誤還是錯了?

int main() { 

    int c; 

    while ((c=getchar()) != EOF) { 

     if (c != ' ' || c != '\n' || c != '\t') 
      putchar(c); 
     else { 
      putchar('\n'); 
     } 
    } 

    return 0; 

} 

回答

16

的條件正確的變化是:

if (!(c == ' ' || c == '\n' || c == '\t')) 

if (c != ' ' && c != '\n' && c != '\t') 

De Morgan's law

+2

+1鏈接到德摩根定律 – 2011-05-16 20:59:58

+0

@ Paul R.和匿名 - 謝謝;) – MByD 2011-05-16 21:03:42

+0

@謝 - 謝謝。我想過,但懶得編輯的:) – MByD 2011-05-16 21:05:46

3

您需要更改|| s到&& S,即改變

 if (c != ' ' || c != '\n' || c != '\t') 

 if (c != ' ' && c != '\n' && c != '\t') 

即「如果C不等於空間和C不等於返回和C不等於選項卡,然後......」

1

你可以做什麼MByD說,或你可以改變你的(||)和(& &)。

0

錯誤出現在您的條件表達式中。當你否定第一個表達式

!(c== ' ' || c== '\n' ||c == '\t') 

你:

c!= ' ' && c!= '\n' &&c != '\t' 

,而不是你在你的問題中定義。

記住:

(A & & B)是相同的(!甲|| B)

0

A or B or C相反的是not A and not B and not C,所以使用:

if(c != ' ' && c != '\n' && c != '\t') 
2

記住您的邏輯編程類:

!(A || B) == (!A && !B) 
!(A && B) == (!A || !B) 

換句話說:你的病情需要這樣寫:

if (c != ' ' && c != '\n' && c != '\t') 
0

你需要多學習一點上DeMorgan's Laws。僅將組合運算符從「||」改爲「到「& &」,您還必須否定所有要組合的元素才能獲得相同的解決方案集。

4

你已經得到了許多你原來的問題的答案,但我覺得有必要添加一個小的細節:原來的和修改後的版本都會遇到一些我認爲會遇到的問題。首先,它們沒有正確檢測到空白區域(例如,它們忽略垂直製表符以及區域設置定義的任何其他空白區域),並且如果單詞由多個空格字符分隔,則它們會生成空行。

對於第一個問題,我使用isspace而不是直接比較你所知道的空白字符(順便說一句,消除你遇到的問題的根源)。對於第二種情況,可以添加一些邏輯以在遇到第一個時跳過所有連續的空格字符,或者當且僅當當前字符是空格時,您可以添加標記以寫出新行你寫的前一個字符不是新行。

或者,你可以使用scanf%s轉換讀單詞:

char buffer[256]; 

while (scanf("%255s", buffer)) 
    printf("%s\n", buffer); 

然而這種方法,規定了一個字的大小的上限。在正常情況下,這很少有問題,但取決於輸入的性質,它可以/可以。

+0

感謝與程序員分享問題。我也會嘗試。 – bornfree 2011-05-17 05:54:25