getchar() getch() getche() gets() puts() scanf()的用法及區別

getchar() putchar(ch) scanf()   頭文件stdio.hhtml

getch() getche()   頭文件conio.h數組

gets() puts()    頭文件stdio.h緩存


 

getch()和getche()函數 都是從鍵盤上讀入一個字符,但getch()函數不將讀入的字符回顯在顯示屏幕上,而getche() 函數卻將讀入的字符回顯到顯示屏幕上。安全

而getchar()函數與上述兩個函數的區別是:需等待輸入直到按回車才結束, 回車前的全部輸入字符都會逐個顯示在屏幕上,但只有第一個字符做爲函數的返回值函數

getchar()   所在頭文件 stdio.hspa

原型: int getchar(void); // 是stdio.h中的庫函數,返回的是一個int型的數.net

做用是從stdin流中讀入一個字符,也就是說,若是stdin有數據的話不用輸入它就能夠直接讀取了,第一次getchar()時,確實須要人工的輸入,可是若是你輸了多個字符,之後的getchar()再執行時就會直接從緩衝區中讀取了命令行

有一個int型的返回值.當程序調用getchar時.程序就等着用戶按鍵.用戶輸入的字符被存放在鍵盤緩衝區中,直到用戶按回車爲止(回車字符也放在緩衝區中).當用戶鍵入回車以後,getchar纔開始從stdio流中每次讀入一個字符.getchar函數的返回值是用戶輸入的第一個字符的ASCII碼,如出錯返回-1.指針

若用戶在按回車以前輸入了不止一個字符,其餘字符會保留在鍵盤緩存區中,等待後續getchar調用讀取.注意:已在鍵盤緩衝區的字符,不用等待用戶按回車鍵就會調用getchar直到緩衝區中的字符讀完爲後,纔等待用戶按鍵.code

鍵盤輸入的字符都存到緩衝區內,一旦鍵入回車,getchar就進入緩衝區讀取字符,一次只返回第一個字符做爲getchar函數的值,若是有循環或足夠多的getchar語句,就會依次讀出緩衝區內的全部字符直到'\n'.要理解這一點,之因此你輸入的一系列字符被依次讀出來,是由於循環的做用使得反覆利用getchar在緩衝區裏讀取字符,而不是getchar能夠讀取多個字符,事實上getchar每次只能讀取一個字符

ch=getchar(); //等待從鍵盤上輸入一個字符
putchar(ch); //輸出此字符

#include <stdio.h>
int main()
{
int c;
while ((c = getchar()) != '\n') //不斷循環調用getchar直至用戶鍵入回車(即換行)
printf("%c", c);
return 0;
}

結果


 

getch() 非標準函數,要注意移植性 所在頭文件:conio.h

是一個不回顯函數,當用戶按下某個字符時,函數自動讀取,無需按回車,有的C語言命令行程序會用到此函數作遊戲,

函數原型:int getch(void); //從控制檯讀取一個字符,但不顯示在屏幕上
char ch;或int ch;
_getch();或ch=_getch();
用_getch();會等待你按下任意鍵,再繼續執行下面的語句;
用ch=_getch();會等待你按下 任意鍵以後,把該鍵 字符所對應的ASCII碼賦給ch,再執行下面的語句。
#include<stdio.h>
#include<conio.h>
int main()
{
    char c;
    while((c=getch())!='\r') { //每接收到用戶鍵入的一個字符則輸出一個*直到按下了回車鍵
        printf("*");
    }
    return 0;
}

結果:

 getche() 功能:輸入後當即從控制檯取字符,不以回車爲結束(帶回顯)

原型:int getche(void);   //所在頭文件:conio.h  返回值:輸入字符對應的ASCII碼
#include<stdio.h>
#include<conio.h>
int main(void)
{
    char ch;
    printf("please input a character:");
    ch=getche();
    printf("\nyou have input a character '%c'\n",ch);
    return 0;
}

結果: 可見,一、帶回顯 二、一旦輸入一個字符則馬上回從控制檯讀取

 

getch()和getche()函數的區別:

#include <stdio.h>
#include <conio.h>
int main()
{
    char c, ch;
    c=getch(); //從鍵盤上讀入一個字符不回顯送給字符變量c
    putchar(c); //輸出該字符
    puts(""); //puts()輸出內容並換行
    ch=getche(); //從鍵盤上帶回顯的讀入一個字符送給字符變量ch
    putchar(ch);
    return 0;
}

針對ch=getche(); 運行結果可見會既回顯用戶鍵入的字符,又會當即從控制檯取字符並由putchar(ch)輸出,因此會看到兩個重複的字符


gets()  讀一行,從流中讀取字符串,直到出現換行符或'\n'讀到文件尾EOF爲止,最後加上'\0'做爲字符串結束。所讀取的字符串暫存在給定的參數string中
原型:char * gets(char * string); //注意只能接收char* 類型,成功則返回char*類型的指針,不然返回NULL

#include <stdio.h>
int main(void)
{
    char str[10];
    printf("Input a string.\n");
    gets(str);
    printf("The string you input is: %s",str);    //輸出全部的值,注意a
}

注意:因爲gets()不檢查字符串string的大小,必須遇到換行符或文件結尾纔會結束輸入,所以容易形成緩存溢出的安全性問題,致使程序崩潰,可使用fgets()代替

若是輸入123456(長度小於10),則輸出結果爲:
Input a string.
123456↙
The string you input is:123456

若是輸入12345678901234567890(長度大於10),則輸出結果爲:
Input a string.
12345678901234567890↙
The string you input is:12345678901234567890
同時看到系統提示程序已經崩潰。

scanf()  頭文件:stdio.h

原型:scanf("格式控制字符串",變量地址列表);

接受字符串時:scanf("%s",字符數組名或指針); 即第二個參數只能是字符指針,若接受int類型的數組,則需不斷循環,每次取數組中的一個數

#include <stdio.h>
int main()
{
    int arr[5];
    for(int i=0; i<5; ++i) {
        scanf("%d",&arr[i]); //注意scanf的第一個參數裏,除了以%開始的格式控制以外,最好不要加任何其餘字符,像是空格、tab等
    }
    /*
    //也能夠用C++11特性等效替換
    for(auto& elem : arr){
        scanf("%d",&elem);
    }
    */
    for(int j=0;j<5; ++j) {
        printf("%d ",arr[j]);
    }
    return 0;
}    

 

注意:scanf的第一個參數裏,除了以%開始的格式控制以外,最好不要加任何其餘字符,像是空格、tab等,由於用戶在輸入的時候加空格,tab或換行均可以識別的,而不是與scanf中的格式控制保持一致。

 

puts() 函數用來向標準輸出設備(屏幕)寫字符串並換行,其調用方式爲,puts(s);其中s爲字符串字符(字符串數組名或字符串指針),注意:puts輸出字符串時要遇到'\0(即字符結束符)才中止

原型:

int puts(const char *string);
如puts("*******************************");
相關文章
相關標籤/搜索