相關函數原型(從控制檯獲取輸入,不考慮寬字符):數組
int scanf( const char *format, ... ); int getchar(void); char *gets( char *str ); char *gets_s( char *str, rsize_t n ); char *fgets( char *str, int count, FILE *stream );
\0
;該函數能夠從標準輸入讀取內容,返回值爲讀取的參數個數,例如:函數
#include <stdio.h> int main() { int seed; printf("%d\n", scanf("%d %d", &seed, &seed)); }
運行程序,輸入 兩個整數,打印爲 2,測試輸入3個值仍然打印2,是由於這個"%d %d"指定了只解析兩個int,多餘的將留在緩衝區中,若是後面再寫一個scanf,將從緩衝區中繼續解析。測試
如今多加一個scanf
:指針
#include <stdio.h> int main() { int seed; printf("%d\n", scanf("%d %d", &seed, &seed)); printf("%d\n", scanf("%d %d", &seed, &seed)); }
1
輸出:code
1 -1
scanf從緩衝區中解析,返回解析成功的參數個數,由於只有一個1,因此第一個給scanf解析,第一行打印1,第二行解析的時候因讀取到了文件結束表示EOF
返回-1。orm
f
輸出:字符串
0 0
這說明,解析失敗的內容還留在緩衝區給下次scanf用,因此兩個scanf都返回的0。get
由於沒法解析的值會繼續留在緩衝區供下次使用,因此若是是循環scanf
,程序就會跑飛,讓你沒有輸入的機會,可使用綜上一節提供的示例測試一下,運行後直接輸入f
。原型
1 2 3 4 5 6 7
輸出:string
2 2
這代表,返回值最大是佔位符的個數,剩下的內容還留在緩衝區。
scanf
判斷輸入結束,只能在文件輸入模式下利用EOF
判斷,例如:
// qwer.c #include <stdio.h> int main() { int a; while(scanf("%d", &a) != EOF) { printf("%d\n", a); } return 0; }
輸入文件test.txt
內容:
1 2 3 4
編譯: gcc qwer.c -o main -std=c11
。
運行:./main < test.txt
。
這個函數能夠從輸入緩衝區僅讀取一個字符,返回int,後面結合fgets
使用。
在讀取字符串時,scanf()
和轉換說明%s
只能讀取一個單詞,但是程序中常常要讀取一整行輸入。gets
函數簡單易用,它讀取整行輸入,直到遇到換行符,而後丟棄換行符,存儲其他字符,並在這些字符的末尾添加一個空字符使其成爲一個c字符串。它常常和puts
函數配對使用,該函數用於顯示字符串,並在末尾添加換行符。
#include <stdio.h> #define STLEN 81 int main() { char words[STLEN]; puts("Enter a string, please."); gets(words); // 典型用法 printf("Your string twice:\n"); printf("%s\n", words); puts(words); puts("Done."); return 0; }
printf("%s\n", words);
和puts(words);
效果相同,可是編譯的時候會產生警告,由於gets
讀取整行輸入,並不知道words
能存多少,若是輸入字符串過長,會致使緩衝區溢出。
例如將STLEN
設置成5
,程序依然能夠運行,嘗試輸入過長的數據就可能會發成溢出,最直觀的就是能夠看到發生段溢出後程序異常退出。
該函數是c11纔有的,且爲拓展函數,使用方式除了能夠設置讀取的字符數以外和gets
函數用法同樣。
這個函數除了能夠從標準輸入讀取字符串以外,還能夠從文件中讀取,並且能夠指定讀取字符個數,比gets_s
更加靈活易用,利用fgets
,可是fgets
不會自動丟棄超過字符個數以外的行緩衝區數據,因此要配合getchar
將剩餘的緩衝數據丟棄,不然可能形成程序運行以異常。
爲知足如下幾點編寫自定義輸入:
char *s_gets(char *str, int n) { char *ret_var; int i = 0; ret_var = fgets(str, n, stdin); if(ret_var) { while(str[i] != '\n' && str[i] != '\0') { i++; } if(str[i] == '\n') str[i] = '\0'; else while(getchar() != '\n') continue; } return ret_var; }
使用方式
#include <stdio.h> #define STLEN 8 int main() { char words[STLEN]; while(s_gets(words, STLEN) && words[0] != '\n') // 沒有輸入數據會自動退出程序 { puts(words); } return 0; }