2013-07-30 92 views
-1

例如說我有以下主要功能:閱讀串空間

int main() 
{ 

    char a[1023]; 

    while (scanf("%s",a) != EOF) 
    { 
     printf("%s ",a); 

    } 
} 

如果我輸入

a ab abc(newline) 

它應該輸出:

a ab abc(newline) 

但主要功能輸出

a ab abc (newline) // there is a space between newline and the last string 

我想逐一讀取字符串。有什麼問題,我怎樣才能刪除這個空間?謝謝。

+0

by'input'你的意思是說你存儲的值是'a',還是你的意思是命令行參數? –

+0

使用「%s」,你告訴printf在那裏放置一個空間。 – Duck

+0

可能重複的[如何將空格掃描爲字符串?](http://stackoverflow.com/questions/6853789/how-do-i-scan-spaces-into-aa-string) – dasblinkenlight

回答

1

您的printf("%s ",a);語句在輸出每個字符串後輸出一個空格,無論如何。只有在需要更多字符串時,才需要輸出空格。相同(更容易),輸出空間每個字符串,如果它不是第一個前:

int first = 1; 
while (scanf("%s",a) != EOF) { 
    if (!first) printf(" "); 
    printf("%s",a); 
    first = 0; 
} 

也,你永遠輸出一個換行符,儘管描述換行符作爲輸出...

1

關於自主學習的一點注意事項:

您第一次使用任何標準庫函數,您應該閱讀其相應的手冊至少一次。原因是,只要你知道任何問題(或有用的功能),你就會知道要避免這些問題(或使用有用的功能)。閱讀手冊確實可以幫助您充分發揮潛力並避免C的缺陷。

您第一次閱讀某些內容時,可能無法完全理解它。不要讓這打擾你;只要繼續閱讀。如果發生這種情況,我建議您在頁面底部再次閱讀,並嘗試第二次完全理解它。請至少閱讀the fscanf manual一次。


現在已經不合適了。你可能會注意到很少有^這裏和那裏的上標。我的意圖是通過閱讀和理解上面鏈接的手冊來註釋你將學到的事實。

格式說明符%s在儘可能消耗盡可能多的非空白之前丟棄儘可能多的空白^。假設你要輸入一些有四個空白字節的東西,你的輸出將不會有這四個空白字節。

"This uses four spaces" translates to "This uses four spaces". 

這似乎合乎邏輯的,這違反了程序規範,它擴展了你的問題^。也許你應該使用%[格式說明符,而不是^。在這種情況下,一條空行將被視爲匹配失敗,並且該行的目的地將是不確定的,因此您需要更好地處理返回值^(無論如何,我鼓勵您這樣做)。

#include <stdio.h> 

int main(void) { 
    char line[512]; 
    int x; 

    do { 
     x = scanf("%511[^\n]", line); 
     if (x == 0) { 
      /* Match failure caused by inputting an empty line. Print empty line? */ 
      putchar('\n'); 
     } 
     else if (x == 1) { 
      /* Success. */ 
      puts(line); 
     } 

     /* Read and discard the remainder of a line */ 
     do { x = getchar(); } while (x >= 0 && x != '\n'); 
    } while (x != EOF); 
} 

從這個環的長度和問題的簡單,你可能有理由相信使用scanf這可能是錯誤的方式來解決這個問題。您可以通過使用最內層循環的派生來消除line陣列,調用scanf以及由此產生的scanf錯誤檢查。像這樣的東西看起來不錯:

#include <stdio.h> 

int main(void) { 
    int c; 
    do { 
     c = getchar(); 
    } while (c >= 0 && putchar(c) >= 0 && c != '\n'); 
} 

PS。還有一個getchar,putcharmany other standard things的手冊。

+1

Upvoted for pointing out the手動,但手腕上沒有指出大多數當前版本的象徵性耳光。 Open Group基本規格問題7在這裏:[The Manual](http://pubs.opengroup.org/onlinepubs/9699919799/),['fscanf()'](http://pubs.opengroup.org/onlinepubs /9699919799/functions/fscanf.html),['getchar()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/getchar.html),['putchar()'](http:/ /pubs.opengroup.org/onlinepubs/9699919799/functions/putchar.html)。 –

+0

我看到您已更新到當前版本的鏈接。我把你放在象徵性的手腕上。 (另外,感謝您提供了舊版POSIX文檔的鏈接,這對於比較有用。) –

+0

@ElchononEdelson您可能還有興趣注意POSIX和C標準之間'fscanf'的區別。在C標準中,只有在第一次成功轉換之前遇到文件結尾時,纔可以返回「EOF」:*如果在第一次轉換之前發生輸入故障,則fscanf函數返回宏EOF的值(if任何)已完成。否則,該函數返回分配的輸入項的數量,如果出現早期匹配失敗*,該輸入項可能少於規定的數量,甚至爲零。謝天謝地,編寫代碼來處理POSIX和C'fscanf'並不難 – Sebivor