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語言命令行程序會用到此函數作遊戲,
#include<stdio.h> #include<conio.h> int main() { char c; while((c=getch())!='\r') { //每接收到用戶鍵入的一個字符則輸出一個*直到按下了回車鍵 printf("*"); } return 0; }
結果:
getche() 功能:輸入後當即從控制檯取字符,不以回車爲結束(帶回顯)
#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(即字符結束符)才中止
原型: