從scanf談起:數組
int scanf( const char *format [, argument]... ); int _scanf_l( const char *format, locale_t locale [, argument]... ); int wscanf( const wchar_t *format [, argument]... ); int _wscanf_l( const wchar_t *format, locale_t locale [, argument]... );
Return Value
Returns the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned.
If format is a NULL pointer, the invalid parameter handler is invoked, as described in Parameter Validation. If execution is allowed to continue, these functions return EOF and set errno to EINVAL.
For information on these and other error codes, see _doserrno, errno, _sys_errlist, and _sys_nerr.ide
// crt_scanf.c // compile with: /W3 /* This program uses the scanf and wscanf functions * to read formatted input. */ #include <stdio.h> int main( void ) { int i, result; float fp; char c, s[81]; wchar_t wc, ws[81]; result = scanf( "%d %f %c %C %80s %80S", &i, &fp, &c, &wc, s, ws ); // C4996 // Note: scanf and wscanf are deprecated; consider using scanf_s and wscanf_s printf( "The number of fields input is %d\n", result ); printf( "The contents are: %d %f %c %C %s %S\n", i, fp, c, wc, s, ws); result = wscanf( L"%d %f %hc %lc %80S %80ls", &i, &fp, &c, &wc, s, ws ); // C4996 wprintf( L"The number of fields input is %d\n", result ); wprintf( L"The contents are: %d %f %C %c %hs %s\n", i, fp, c, wc, s, ws); } 71 98.6 h z Byte characters 36 92.3 y n Wide characters The number of fields input is 6 The contents are: 71 98.599998 h z Byte characters The number of fields input is 6 The contents are: 36 92.300003 y n Wide characters
天然數:符合輸入格式的數據的個數函數
0:不符合輸入格式的數據(若是Ctrl+Z和回車鍵之間有其餘字符,則也返回0)操作系統
以"%d"爲例:要求是十進制整數,若是輸入字符'r'、'e'、'\'等,就返回0,天然地,'\n''\0''eof'也返回0,這與他們自己的含義(好比換行符、終止符、文件結束符)並沒有關係
-1:Ctrl+Z(緊接着按下回車鍵)翻譯
注:Windows系統中通常採用阻塞式檢查 Ctrl+Z、Unix/Linux系統下通常採用非阻塞式的檢查 Ctrl+D。本程序是在Windows系統下,所以使用阻塞式的 Ctrl+Z 來標識流的結束。code
阻塞式方式的特色:orm
只有按下回車以後纔有可能檢測在此以前是否有Ctrl+Z按下。文檔
(按照輸入時間順序讀取輸入緩衝區的數據)讀取到Ctrl+Z時,若是後面有可讀的數據,則不會理睬Ctrl+Z,也就是不認爲Ctrl+Z表明着流的末尾。(由於有要讀的數據,還不能認爲到了流的末尾)。字符串
Ctrl+Z產生的不是一個普通的ASCII碼值,也就是說它產生的不是一個字符,因此不會跟其它從鍵盤上輸入的字符同樣可以存放在輸入緩衝區。get
將鍵盤上敲下的字符送入輸入緩衝區。
若是用戶在按回車鍵以前輸入了不僅一個字符,其餘字符會保留在鍵盤緩衝區中,等待後續的輸入函數(好比scanf()、getchar())調用讀取。也就是說,後續的scanf()調用不會等待用戶按鍵,而是直接讀取緩衝區中的字符,直到緩衝區的字符讀取完畢後,纔等待用戶按鍵。
對於scanf(),只有字符char在輸入流中的獲取會認可空格或回車中的換行符爲所要取的值,別的如字符串或者字符數組或int類型均不認爲空格或回車中的換行符爲其值即丟棄空格符和回車符,以空格做爲劃分。
'\n'、'\0'、'eof'是C/C++編譯器在編譯代碼時識別的符號。
Ctrl+Z是操做系統在處理輸入流時識別的符號。
'\n'換行符,
#include <stdio.h> int main() { int c; do { printf("請輸入文檔的結尾標誌"); }while((c=getchar())!='\n'); printf("已獲得文檔結束標誌\n"); //直接回車 return 0; }
'\0'終止符
'\0' is the null termination character. It marks the end of the string.
char cAlphabet[] = "I know all about programming!";
is the same as
char cAlphabet[] = {'I',' ', 'k','n','o','w',' ','a','l','l',' ','a','b','o','u','t',' ','p','r','o','g','r','a','m','i','n','g','!','\0'};
#include <stdio.h> int main() { int c; do { printf("請輸入文檔的結尾標誌"); }while((c=getchar())!='\0'); printf("已獲得文檔結束標誌\n"); return 0; }
'eof'文件結束符
#include <stdio.h> int main() { int c; do { printf("請輸入文檔的結尾標誌"); }while((c=getchar())!=EOF); printf("已獲得文檔結束標誌\n"); //Ctrl+Z而後回車 return 0; }
在控制檯輸入的時候,操做系統將Ctrl+Z翻譯爲文檔結束符。