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


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

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

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


 

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

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

getchar()   所在頭文件 stdio.h

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

作用是從stdin流中讀入一個字符,也就是說,如果stdin有數據的話不用輸入它就可以直接讀取了,第一次getchar()時,確實需要人工的輸入,但是如果你輸了多個字符,以后的getchar()再執行時就會直接從緩沖區中讀取了

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

若用戶在按回車之前輸入了不止一個字符,其他字符會保留在鍵盤緩存區中,等待后續getchar調用讀取.注意:已在鍵盤緩沖區的字符,不用等待用戶按回車鍵就會調用getchar直到緩沖區中的字符讀完為后,才等待用戶按鍵.

鍵盤輸入的字符都存到緩沖區內,一旦鍵入回車,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;
}

結果: 可見,1、帶回顯 2、一旦輸入一個字符則立刻回從控制台讀取

 

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("*******************************");


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM