輸入函數對比

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); 

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章