0 scanf
(0) 函數原型:int scanf(const char * restrict format,...);
(1) 返回值:返回成功讀入的數據項數,注意是數據項數;例如scanf(“%d %d”, &a, &b),如果a、b都被讀入則返回2,如果只有a被讀入則返回1。
(2) 標準的庫函數,包含在#include <stdio.h>中。
(3) 讀字符規則:scanf函數不檢測讀入的字符的個數。僅僅是不斷的從標準輸入流(鍵盤)中讀入字符,直到遇到“空白符”(換頁符、縱向製表符、橫向製表符('\t')、空格(' ')、換行符('\n')、回車符('\r'))。
1 gets / fgets
(0)函數原型:char *fgets(char *buf, int bufsize, FILE *stream) char * gets ( char * buf )。
(1)返回值:如果正常則是返回與參數buf相同的指針。
(2)標準的庫函數,包含在#include <stdio.h>,gets包含在#include <string.h>中。
(3)兩者區別在於:fgets由於有參數bufsize的限制,所以會更加安全,另外各自的讀取字符規則也有較大的區別,詳見下述。
(4)讀字符規則:對於fgets,讀取一行數據,包括回車。如果該行內容不足bufsize個字符,則正常結束,如果該行內容超過bufsize-1個字符,則fgets只返回一個不完整的行。緩衝區殘留內容會在下一次重新被fgets讀取,當然如果沒有手動重新fgets可能就會被丟棄。對於gets函數,讀取一行數據,直到輸入回車才返回,且不會存儲回車,所有除回車以外的數據會被存儲在指定的緩衝區中。注意這裏是最多10個字節
(5)程序示例,如下所示。
//keyboard input "01234567890123\n" //output "012345678" //10表示的最多接收9個字符 // "90123"//這個是用戶輸入的回車字符 // "" //回車,printf的回車 // “ ” //光標所在位置
char buf[10] = { 0 }; while (fgets(buf,10,stdin)){//最多9個字符,剩餘的再下一次while中讀取 printf("%s\n", buf); } //keyboard input "01234567890123\n" //output "01234567890123" //回車,printf的回車 // "" //光標所在位置 char buf[20] = { 0 }; while (gets(buf)){ printf("%s\n", buf); } |
2 getc / fgetc
(0)函數原型:int getc(FILE *stream) int intgetc(FILE *stream)。
(1)返回值:讀取的字符。
(2)標準的庫函數,包含在#include<stdio.h>。
(3)兩者區別在於:fgetc是函數,而getc是基於fgetc實現的宏。對比分析在於2點,首先getc是基於宏沒有函數調用,所以理論上會更高效,沒有堆棧的調用約束,但是如果在寄存器充足的情況,這種差別可以忽略。其次,getc因爲是宏,所以也需要注意宏的副作用。綜上,建議使用fgetc。
(4)讀字符規則:等待用戶輸入,直到按下回車才結束,此時把緩衝區的內容逐個顯示,包括回車字符。
(5)程序示例,如下所示。
//keyboard input "abc\n" //output " -- a" // " -- b" // " -- c" // " -- " //回車,這個是用戶輸入的回車字符 // " " //多出一個空行,是printf裏的回車 while (ch = getc()) { printf(" -- %c\n", ch); }
//keyboard input "abc\n" //output " -- a" // " -- b" // " -- c" // " -- " //回車,這個是用戶輸入的回車字符 // " " //多出一個空行,是printf裏的回車 while (ch = fgetc()) { printf(" -- %c\n", ch); } |
3 getch / getche
(0) 函數原型:int getch(void)int getche(void)
(1) 返回值:讀取的字符;
(2) 這兩個不是C標準庫函數,需要#include <conio.h>。爲了程序可移植性不推薦使用;
(3) 兩者區別在於getch不帶回顯,而getche是帶回顯的。
(4) 讀字符規則:等待用戶從鍵盤輸入,用戶一旦按下按鍵,無論是否包含回車,函數都會返回。
(5) 程序示例,如下所示。
//keyboard input "abc" //output " -- a" // " -- b" // " -- c" while (ch = getch()) { printf(" -- %c\n", ch); }
//input "abc" //output "a -- a" // "b -- b" // "c -- c" while (ch = getche()) { printf(" -- %c\n", ch); } |