2016-08-17 67 views
0

我是編程新手,我決定從c開始。我正在使用K & R的書,並且有這個練習,它要求編寫一個程序,將輸入複製到輸出,用一個空白替換一個或多個空白。然而,當我編寫我的程序(我確信它不正確,但沒關係,因爲我在這裏學習),我想知道我做錯了什麼。還有一點需要注意的是:當我用3個空格鍵入我的名字時,它減少到2個,但是當使用兩個或一個空格時,沒有任何反應。代碼下面貼如何用一個空白替換c編程中的多個空白?

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


int main(void) 
{ 
int c; // getchar value 
int blanks = 0; // counting the amount of blanks. If more than one then replace with blanks_2 
char blanks_2 = ' '; //character value for replacement in case blanks is more than one 

printf("Enter your name please\n"); 

while((c = getchar()) != EOF){ 
if(c == ' '){ 
    ++blanks; 

    if (blanks >= 1){ 
     putchar(blankos); } 
    } 
if(c >= 'a' && c <= 'z'){ 
    putchar(c); 
} 
if (c >= 'A' && c <= 'Z'){ 
    putchar(c); 
} 

} 

return 0; 

} 
+0

你的意思是用一個空白替換連續的黑色,對不對? –

+0

是的。這似乎不工作@chux。我之前做過類似的事情,但是這使得空白回到0.當寫我的名字時,我的名字沒有空格 – Thenoobienoob

+2

給出的答案並不壞,但它們不能幫助你理解你的代碼有什麼問題。如果你是編程新手,學習跟蹤代碼很重要。因此,有些問題可以幫助您找到* your *代碼中的錯誤,而不是將其替換爲別人的代碼:如果您的輸入是'The ... noobie ..... noob'[[ =空格]?爲每個角色手動查看循環。跟蹤空白的價值,問問自己什麼時候應該做putchar,以及現在做什麼時候。當您在單詞2和單詞3之間時,會出現什麼情況? –

回答

1

我猜你是想編寫一個程序,得到這樣的東西作爲輸入:

John  David  Doe 

,並顯示此作爲輸出:通過刪除所有

John David Doe 

額外的空間。這應該工作:

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

int main(void) 
{ 
    int c; // getchar value 
    int blanks = 0; // counting the amount of blanks. If more than one then replace with blanks_2 

    printf("Enter your name please\n"); 

    while((c = getchar()) != EOF) 
    { 
     if(c == ' ') 
     { 
      // count blanks 
      ++blanks; 

      if (blanks==1)  
       putchar(c); // display only the 1st blank 
     } 

     if(isalpha(c)) 
     { 
      putchar(c); 
      blanks=0; // reset blanks counter as c is an alpha character 
     } 
    } 

    return 0; 
} 
+0

書中還沒有isalpha功能呢。剛剛開始,並在第20頁。我嘗試輸入代碼,但它似乎並不幸運。 – Thenoobienoob

+0

'isalpha'不等於'not(isspace)',這讓我想知道爲什麼你將這個函數引入noobienoob。 – usr2564301

1

你不需要計算確切的空白數。一旦找到空白的「舉起旗幟」即可找到空白。當您再次非空白字符打印空白,把旗回0。另外,插入「繼續」在你的代碼語句,以避免不必要的檢查:

int main(void) 
{ 
    int c; // getchar value 
    int blankfound = 0; 

    printf("Enter your name please\n"); 

    while((c = getchar()) != EOF){ 
     if(c == ' '){ 
     blankfound = 1; 
     continue; 
     } 
     if(c >= 'a' && c <= 'z'){ 
     if (blankfound == 1) 
     { 
      putchar(' '); 
      blankfound = 0; 
     } 
     putchar(c); 
     continue; 
     } 
     if (c >= 'A' && c <= 'Z'){ 
      if (blankfound == 1) 
      { 
      putchar(' '); 
      blankfound = 0; 
      } 
      putchar(c); 
      continue; 
     } 

} 

return 0; 

} 
+0

好的,謝謝你的建設性反饋。它似乎工作,我理解循環的第一部分,但是你能解釋一下爲什麼每次訪問非空白字符時都需要添加一個空格? – Thenoobienoob

+0

空白字符被訪問的信息保存在空白變量中。噹噹前字符是非空字符時,將檢查空白變量的值。如果它是1,這意味着在當前非空白字符之前至少存在一個空白字符。因此,在打印當前字符值之前,您應該按照任務要求打印空白字符。當然......你也應該將空白找回爲0以便識別未來可能出現的空白字符。 –

1

許多學習者代碼分配上的工作基於之前的角色的功能概念。

考慮以下佈局

int previous = something(); 
while ((c = getchar()) != EOF) { 
    do_stuff(previous, c); 
    previous = c; 
} 

對於OP,這將是:如果字符不是空格或前一個字符不是空間,打印。

printf("Enter your name please\n"); 
int previous = 0; 
int c; 
while((c = getchar()) != EOF) { 
    if ((c != ' ') || (previous != ' ')) { 
    putchar(' '); 
    } 
    previous = c; 
} 

簡化算法有助於看到如下所示的缺陷。出現字母時,不會重置blanks。當遇到一個或多個空格時打印。

if(c == ' '){ 
    ++blanks; 

    if (blanks >= 1){ 
     putchar(blankos); } 
    } 
if(c >= 'a' && c <= 'z'){ 
    putchar(c); 
} 
if (c >= 'A' && c <= 'Z'){ 
    putchar(c); 
}