程序是人機交互的媒介,有輸出必然也有輸入,我們開始講解如何從鍵盤輸入數據。在C語言中,有多個函數可以從鍵盤獲得用戶輸入:
scanf():和 printf() 類似,scanf() 可以輸入多種類型的數據。
getchar()、getche()、getch():這三個函數都用于輸入單個字符。
gets():獲取一行數據,并作為字符串處理。
scanf() 是最靈活、最複雜、最常用的輸入函數,但它不能完全取代其他函數,大家都要有所了解。
scanf()函數scanf 是 scan format 的縮寫,意思是格式化掃描,也就是從鍵盤獲得用戶輸入,和 printf 的功能正好相反。
舉例:
#include<stdio.h>
int main()
{
int x=0;
printf("1 1=?\n");
scanf("%d",&x); //格式:scanf("格式控制字符串",&地址列表);
if(x!=2)
對于 scanf(),輸入數據的格式要和控制字符串的格式保持一緻。
其實 scanf 和 printf 非常相似,隻是功能相反罷了:
scanf("%d %d", &a, &b); // 獲取用戶輸入的兩個整數,分别賦值給變量 a 和 b
printf("%d %d", a, b); // 将變量 a 和 b 的值在顯示器上輸出
它們都有格式控制字符串,都有變量列表。不同的是,scanf 的變量前要帶一個&符号。
&稱為取地址符号,也就是獲取變量在内存中的地址。
數據是以二進制的形式保存在内存中的,字節(Byte)是最小的可操作單位。
為了便于管理,我們給每個字節分配了一個編号,使用該字節時,隻要知道編号就可以,
就像每個學生都有學号,老師會随機抽取學号來讓學生回答問題。字節的編号是有順序的,從 0 開始,接下來是 1、2、3……
下圖是 4G 内存中每個字節的編号(以十六進制表示):
這個編号,就叫做地址(Address)。
int a;會在内存中分配四個字節的空間,我們将第一個字節的地址稱為變量 a 的地址,也就是&a
的值。對于整數、浮點數、字符,都要使用 & 獲取它們的地址,scanf 會根據地址把讀取到的數據寫入内存。
再來看一個 scanf 的例子:非常重要#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d %d", &a, &b);
printf("a b=%d\n", a b);
scanf("%d %d", &a, &b);
printf("a b=%d\n", a b);
scanf("%d, %d, %d", &a, &b, &c);
printf("a b c=%d\n", a b c);
scanf("%d is bigger than %d", &a, &b);
printf("a-b=%d\n", a-b);
return 0;
}
運行結果:
第一個 scanf() 的格式控制字符串為"%d %d",中間有一個空格,而我們卻輸入了10 20,中間有多個空格。
第二個 scanf() 的格式控制字符串為"%d %d",中間有多個空格,而我們卻輸入了100 200,中間隻有一個空格。這說明 scanf() 對輸入數據之間的空格的處理比較寬松,并不要求空格數嚴格對應,多幾個少幾個無所謂,隻要有空格就行。
第三個 scanf() 的控制字符串為"%d, %d, %d",中間以逗号分隔,所以輸入的整數也要以逗号分隔。
第四個 scanf() 要求整數之間以is bigger than分隔。
用戶每次按下回車鍵,程序就會認為完成了一次輸入操作,scanf() 開始讀取用戶輸入的内容,并根據格式控制字符串從中提取有效數據,隻要用戶輸入的内容和格式控制字符串匹配,就能夠正确提取。
本質上講,用戶輸入的内容都是字符串,scanf() 完成的是從字符串中提取有效數據的過程。
最後需要注意的一點是,scanf() 讀取字符串時以空格為分隔,遇到空格就認為當前字符串結束了,所以無法讀取含有空格的字符串。
這個例子你搞懂了,簡單的scanf用法就沒問題了,所以認真看完思考。
scanf() 格式控制符彙總格式控制符 說明
%c讀取一個單一的字符
%hd、%d、%ld讀取一個十進制整數,并分别賦值給 short、int、long 類型
%ho、%o、%lo讀取一個八進制整數(可帶前綴也可不帶),并分别賦值給 short、int、long 類型
%hx、%x、%lx讀取一個十六進制整數(可帶前綴也可不帶),并分别賦值給 short、int、long 類型
%hu、%u、%lu讀取一個無符号整數,并分别賦值給 unsigned short、unsigned int、unsigned long 類型
%f、%lf讀取一個十進制形式的小數,并分别賦值給 float、double 類型
%e、%le讀取一個指數形式的小數,并分别賦值給 float、double 類型
%g、%lg既可以讀取一個十進制形式的小數,也可以讀取一個指數形式的小數,并分别賦值給 float、double 類型
%s讀取一個字符串(以空白符為結束)
這就是scanf的基本用法了,如果不明白的就多看幾遍,最好上機自己敲一敲,改一改,怕忘記,就收藏起來以後再看。
還有scanf的用法進階的後面會寫。歡迎訂閱點贊,謝謝!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!