從scanf談起:
一: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.
// 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_sprintf( "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 ); // C4996wprintf( 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 charactersThe 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
二、scanf對特殊符號的返回值
自然數:符合輸入格式的數據的個數
-
0:不符合輸入格式的數據(如果Ctrl+Z和回車鍵之間有其他字符,則也返回0)
以"%d"為例:要求是十進制整數,如果輸入字符'r'、'e'、'\'等,就返回0,自然地,'\n''\0''eof'也返回0,這與他們本身的含義(比如換行符、終止符、文件結束符)并無關系
-1:Ctrl+Z(緊接著按下回車鍵)
三、輸入流中Ctrl+Z的含義
注:Windows系統中一般采用阻塞式檢查 Ctrl+Z、Unix/Linux系統下一般采用非阻塞式的檢查 Ctrl+D。本程序是在Windows系統下,因此使用阻塞式的 Ctrl+Z 來標識流的結束。
阻塞式方式的特點:
只有按下回車之后才有可能檢測在此之前是否有Ctrl+Z按下。
(按照輸入時間順序讀取輸入緩沖區的數據)讀取到Ctrl+Z時,如果后面有可讀的數據,則不會理睬Ctrl+Z,也就是不認為Ctrl+Z代表著流的末尾。(因為有要讀的數據,還不能認為到了流的末尾)。
Ctrl+Z產生的不是一個普通的ASCII碼值,也就是說它產生的不是一個字符,所以不會跟其它從鍵盤上輸入的字符一樣能夠存放在輸入緩沖區。
四、鍵盤輸入時回車鍵的作用:
將鍵盤上敲下的字符送入輸入緩沖區。
如果用戶在按回車鍵之前輸入了不只一個字符,其他字符會保留在鍵盤緩沖區中,等待后續的輸入函數(比如scanf()、getchar())調用讀取。也就是說,后續的scanf()調用不會等待用戶按鍵,而是直接讀取緩沖區中的字符,直到緩沖區的字符讀取完畢后,才等待用戶按鍵。
對于scanf(),只有字符char在輸入流中的獲取會承認空格或回車中的換行符為所要取的值,別的如字符串或者字符數組或int類型均不認為空格或回車中的換行符為其值即丟棄空格符和回車符,以空格作為劃分。
五、那換行符'\n'、終止符'\0'、文件結束符'eof'是干嘛的
'\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翻譯為文檔結束符。