2017-10-05 18 views
1

我試圖用getchar/putchar運算符編寫一個簡單的程序。它必須按行顯示文本並將其從新行中的每一句打印出來。一個帶有「getchar/putchar」的程序,它需要一行文本並將它從一個新行中的每個句子打印出來

我寫了這個代碼,但它的作品意外對我來說,比如我寫

"I can't program. Help me. Please." 

它打印出: 「」

I can't program. 
. Help me. 
. Please. 

爲什麼它的複製??? 我的代碼是:

#include <stdio.h> 
#include <stdio.h> 


int main(void) { 
    int stop=0; 
    int i; 
    printf("enter your text: "); 
    while((i=getchar())!=EOF){ 
     if(i=='.') 
     { 
      stop=1; 
      putchar(i); 
      putchar('\n'); 
     } 
     if(i==' ') 
     { 
      if(stop==0) putchar(i); 
     } 

     else if(i!=' '||i!='.') 
     { 
      putchar(i); 
      stop=0; 
     } 
    } 
    return 0; 
} 

在此先感謝您。

回答

0

此:

else if(i!=' '||i!='.') 

是沒有意義的,你的意思是

else if(i != ' ' && i != '.') 
+0

哦~~。我知道在這段代碼中有一些小錯誤!萬分感謝! –

1

A,但重新格式化當焦炭i包含有助於理解錯誤

if(i == '.') { 
    stop = 1;      // part A 
    putchar(i); 
    putchar('\n'); 
} 

if(i == ' ') { 
    if(stop == 0) {     // Part B 
     putchar(i); 
    } 
} else if(i != ' ' || i != '.') { 
    putchar(i);      // Part C 
    stop = 0; 
} 

點,

  • 部分A被執行(並打印點)
  • 對空間中的測試失敗
  • 然後執行else部分

在其他部分中,測試總是成功,因爲你寫了一個「或」而不是「和」。所以點再次打印由部分C.

如何解決它:在你的問題有3種情況(點,空間,其他),你應該避免表達兩次相同的比較。

一種可能性是一系列的if/else,如果/ ...

if (i == '.') { 
    // process dot 
} else if (i == ' ') { 
    // process space 
} else { 
    // process other 
} 

更好的解決方案是使用一個開關

switch (i) { 
case '.': 
     // process dot 
     break; 
case ' ': 
     // process space 
     break; 
default: 
     // process other 
     break; 
} 
相關問題