關於自主學習的一點注意事項:
您第一次使用任何標準庫函數,您應該閱讀其相應的手冊至少一次。原因是,只要你知道任何問題(或有用的功能),你就會知道要避免這些問題(或使用有用的功能)。閱讀手冊確實可以幫助您充分發揮潛力並避免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,putchar和many other standard things的手冊。
by'input'你的意思是說你存儲的值是'a',還是你的意思是命令行參數? –
使用「%s」,你告訴printf在那裏放置一個空間。 – Duck
可能重複的[如何將空格掃描爲字符串?](http://stackoverflow.com/questions/6853789/how-do-i-scan-spaces-into-aa-string) – dasblinkenlight