2013-07-12 47 views
-1

我試圖用一個空白替換多個空格。用C中的getchar()函數掙扎

#include <stdio.h> 
#include <stdlib.h> 
#define MAXLINE 500 

main() { 
    char text[MAXLINE]; 
    int i; 

    for(i = 0; (text[i] = getchar()) != EOF && text[i] != 'x'; i++) { 
     if(text[i] == ' ') 
      i++; 

     while((text[i] = getchar()) != EOF && text[i] != 'x' && text[i] == ' '); 

     if(text[i] == EOF || text[i] == 'x') 
      break; 
    } 

    text[i] = '\0'; 

    printf("\n\n-- Result --\n%s", text); 
} 

我知道getchar()需要一個字符enter按下該按鈕之後,但我已經見過很多次,人們如何使用它,直到EOF發現讓整個字符串。即使在這個例子中,如果我註釋掉while循環(如果我寫一個沒有空白的單詞,我會得到一個正確的字符串),它就可以工作。我想要的是將一個人寫入數組中的每個字符。在這種情況下,getchar()功能可以使用嗎?如果是的話,我需要在這段代碼中進行修改才能使它工作,因爲現在它只打印一些字符(如果while循環未被註釋掉)?正如我所說,如果我寫一個字apple或類似的沒有任何空白和沒有while循環,它的工作原理。

+0

請注意'main()'應該(必須)返回'int'。你應該測試溢出('我 Kninnug

+0

謝謝。一旦我完成了目前的問題,我會解決這些問題。 – Stein

+1

還要注意'getchar()',儘管它是非常通信的名稱,[不會*返回一個'char'](http://linux.die.net/man/3/getchar)(因爲'EOF'確實不適合字符)。 – unwind

回答

0

要讀取所有來自用戶的輸入,直到輸入結束爲止,可以使用類似的方法滑行多次出現的空格。

#include <stdio.h> 
#include <stdlib.h> 
#define MAXLINE 500 

int main() { 
    char text[MAXLINE]; 
    int i; 
    int c; 

    c = getchar(); 
    for (i = 0; c != EOF && i < MAXLINE-1; ++i) { 
     text[i] = c; 

     if (c != ' ') { 
      c = getchar(); 
     } else { 
      while (c == ' ') 
       c = getchar(); 
     } 
    } 
    text[i] = '\0'; 

    printf("\n\n-- Result --\n%s", text); 
} 
+0

謝謝。我在執行getchar時犯了什麼錯誤? – Stein

+0

@decas您將結果分配給一個'char'。在一個8位字節的典型實現中,'getchar'具有257個不同的可能的返回值,所以結果不會無損於'char'。 –

+0

在你的代碼中,只有當空間出現時才增加'i',所以我可以打賭,你會得到每個單詞的第一個字符的數組。並且在'char'中存儲'getchar()'的結果也是錯誤的。 –

0

getchar返回int,而不是一個char,因爲它必須能夠 返回超過可容納在一個char更多的價值。這是 出現編程錯誤將結果分配給char,因爲您的 寬鬆了關鍵信息。根據是否平原char 帶有符號,具有分配 到一個字符後檢查EOF意味着你永遠無法找到EOF(普通 char無符號),或在輸入(ÿ某個字符 拉丁1通常)將被視爲EOF

在C++中,相當於是std::cin.get(),但我們更 一般寫類似:

for (int i = 0; 
     i < sizeof(text) && std::cin.get(text[i]) && text[i] != 'x'; 
     ++ i) { 
    // ... 
} 

(當然,在C++中,我們會最有可能使用的std :: string,與 。只是一個單一的charint爲輸入)

在C(因爲它看起來像這就是你實際使用的), 你需要一個額外的中間變量:

int ch; 
for (int i = 0; 
     i < sizeof(text) && (ch = getchar()) != EOF && ch != 'x'; 
     ++ i) { 
    text[i] = ch; 
    // ... 
} 

請注意,在這兩種語言中,都需要將邊界檢查作爲 的第一個條件。 (在C++中,如果您使用的是 std::string,則不需要它。)

+0

是的,我沒有記住'EOF'是-1,我正在使用字符。 – Stein

+0

@decas'EOF' is _usually_ -1。所有需要的是它是負的(並且'getchar'返回'EOF'或者範圍爲[[0 ... UCHAR_MAX]'的值)。 –

0

您的while循環讀取時不會增加i。所以讀取的所有字符實際上都被丟棄了,因爲它們被下一個循環覆蓋。如果它僅僅到一個空白替代多個空白,你可能會做這樣的事情

char text[1024]; 
int i; 
int c; 

for(i = 0; i < sizeof(text)-1 && (c = getchar()) != EOF && c != 'x';) { 
    if(c != ' ' || i == 0 || text[i-1] != ' ') 
      text[i++] = c; 
} 

正如評論已經statetd:不要直接的getchar()結果直接分配到一個字符,否則比較讀取到字節儘管您尚未到達文件結尾,但EOF可能會導致錯誤。

+0

是的,我扔掉空白,因爲我只需要一個。 – Stein

+0

然後,該代碼應該是適當的 –