2012-03-14 79 views
0

我已經遇到了代碼的這種安寧的問題,它應該將小寫字母改爲大寫,並將多個空格變成一個空格。所以它做錯了什麼,它以某種方式切斷了第一個字母,就像當我寫「abcdefg」時它會在輸出「BCDEFG」中給我一樣。Putchar,getchar,在while循環中缺少字符

main(){ 
int z=0,b; 

     while ((b = getchar()) != '\n') 
     { 
     b=b-32; 
      if (b>0) 
      { 
       putchar(b); 
      } 
      else 
      { 
       if (z>=2) 
       { 
        putchar(b); 
       } 
       else 
       { 
        z=z+1; 
        printf(" "); 
       } 
      } 


     } 
} 
+2

你試過調試過嗎? – 2012-03-14 10:36:32

+2

需要'家庭作業'標籤嗎? – 2012-03-14 10:38:13

回答

0

它似乎產生了我所有的字母...你試圖跟蹤它,找出它在你輸入的字符,每一步在做什麼?

+0

哇,我不知道如何,但現在它工作得很好,無論如何,謝謝。 – user1267757 2012-03-14 10:49:16

0

您的空白處理有一些問題。

看來你會在任何情況下打印一個空格(當你的getchar返回0x20時)。

0

你可以從這開始消除你的空間問題。 否則你是否有特定的問題輸入。因爲我沒有「第一封信」的問題。

main(){ 
int z=1,b; 

     while ((b = getchar()) != '\n') 
     { 
     b=b-32; 
      if (b>0) 
      { 
       putchar(b); 
       z=1; 
      } 
      else 
      { 
       if (z>=2) 
       { 
        putchar(b); 
       } 
       else 
       { 
        z=z+1; 
        printf(" "); 
       } 
      } 


     } 
} 
0

首先你不應該使用像「32」這樣的常量,而是讓系統定義這些值是什麼。 IE:b - = char('');其次,看看函數「islower()」和「toupper()」,C會自動爲你做這件事。

考慮這樣的事情:

包括

主() {

int  flag = 0; 
    char b; 

    while ((b=getchar()) != '\n') { 
      if (flag && isspace(b)) 
        continue; 
      putchar(toupper(b)); 
      if (isspace(b)) { 
        flag = 1; 
        continue; 
      } 
      flag = 0; 
    } 
    putchar('\n'); 

}

輸入: 「一個BC DEF ghijghg 123 A1B2C3」

輸出:「BC DEF GGHGHG 123 A1B2C3」

注意:它看起來像文本框正在消除空格,因爲輸入行中有很多空白。

你應該時刻注意你的邊界條件。如果輸入開始會有一堆空格,它仍然會打印一個空格。要消除所有前導空格,初始化標誌= 1.如果輸入具有尾隨空格,它還會打印最終空格。要消除這些問題,您需要一個稍微不同的解決方案,即在看到空格和另一個可打印字符後打印空間的解決方案。