C語言

當前位置 /首頁/計算機/C語言/列表

C語言從鍵盤輸入資料

程式是人機互動的媒介,有輸出必然也有輸入。下面是小編分享的C語言從鍵盤輸入資料的知識,歡迎大家參考!

C語言從鍵盤輸入資料

在C語言中,有多個函式可以從鍵盤獲得使用者輸入:

scanf():和 printf() 類似,scanf() 可以輸入多種型別的資料。

get)、getche()、getch():這三個函式都用於輸入單個字元。

gets():獲取一行資料,並作為字串處理。

scanf() 是最靈活、最複雜、最常用的輸入函式,但它不能完全取代其他函式,大家都要有所瞭解。

scanf()函式

scanf 是 scan format 的縮寫,意思是格式化掃描,也就是從鍵盤獲得使用者輸入。我們先來看一個例子:

#include#includeint main(){ int a, b, c, d; scanf("%d", &a); //輸入整數並賦值給變數a scanf("%d", &b); //輸入整數並賦值給變數b printf("a+b=%d", a+b); //計算a+b的值 scanf("%d %d", &c, &d); //輸入兩個整數並分別賦值給c、d printf("c*d=%d", c*d); //計算c*d的值 system("pause"); return 0;}

執行結果:

12↙

60↙

a+b=72

10 23↙

c*d=230

↙表示按下回車鍵。

從鍵盤輸入12,按下回車鍵,scanf() 就會讀取輸入資料並賦值給變數 a,本次輸入結束,執行下一條語句。接著給變數b賦值,也是同樣的道理。

第9行程式碼中,我們同時輸入兩個整數並分別賦值給c、d。注意"%d %d"之間是有空格的,所以輸入資料時也要有空格。也就是說,輸入資料的格式要和控制字串的格式一致。

scanf 和 printf 非常相似:

scanf("%d %d", &a, &b); // 獲取使用者輸入的兩個整數,分別賦值給變數 a 和 bprintf("%d %d", a, b); // 將變數 a 和 b 的是在顯示器上輸出。

它們都有格式控制字串,都有變數列表。不同的是,scanf 的變數前要帶一個&符號;&稱為取地址符,也就是獲取變數在記憶體中的地址。

在《二進位制思想以及資料的儲存》一節中講到,資料是以二進位制的形式儲存在記憶體中的,位元組(Byte)是最小的可操作單位。為了便於管理,我們給每個位元組分配了一個編號,使用該位元組時,只要知道編號就可以,就像每個學生都有學號,老師會隨機抽取學號來讓學生回答問題。位元組的編號是有順序的,從 0 開始,接下來是 1、2、3……

下圖是 4G 記憶體中每個位元組的編號(以十六進位制表示):

這個編號,就叫做地址(Address)。int a;會在記憶體中分配四個位元組的空間,我們將第一個位元組的'地址稱為變數 a 的地址,也就是&a的值。對於前面講到的整數、浮點數、字元,都要使用 & 獲取它們的地址,scanf 會根據地址把讀取到的資料寫入記憶體。

我們不妨將它們的地址輸出看一下:

#include#includeint main(){ int a='F'; int b=12; int c=452; printf("&a=%#x, &b=%#x, &c=%#x", &a, &b, &c); system("pause"); return 0;}

輸出結果:

&a=0x18ff48, &b=0x18ff44, &c=0x18ff40

再來看一個 scanf 的例子:

#include#includeint main(){ int a, b, c; scanf("%d %d", &a, &b); printf("a+b=%d", a+b); scanf("%d %d", &a, &b); printf("a+b=%d", a+b); scanf("%d, %d, %d", &a, &b, &c); printf("a+b+c=%d", a+b+c); scanf("%d is bigger than %d", &a, &b); printf("a-b=%d", a-b); system("pause"); return 0;}

執行結果:

10 20↙

a+b=30

100 200↙

a+b=300

56,45,78↙

a+b+c=179

25 is bigger than 11↙

a-b=14

第一個 scanf() 的格式控制字串為"%d %d",中間有一個空格,而我們卻輸入了10 20,中間有多個空格。第二個 scanf() 的格式控制字串為"%d %d",中間有多個空格,而我們卻輸入了100 200,中間只有一個空格。這說明 scanf() 對輸入資料之間的空格的處理比較寬鬆,並不要求空格數嚴格對應。

第三個 scanf() 的控制字串為"%d, %d, %d",中間以逗號分隔,所以輸入的整數也要以逗號分隔。

第四個 scanf() 要求整數之間以is bigger than分隔。

每次使用者按下回車鍵,程式就會認為使用者輸入結束,scanf() 開始讀取使用者輸入的內容,並根據格式控制字串從中提取資料,只要使用者輸入的內容和格式控制字串匹配,就能夠正確提取。

本質上講,使用者輸入的內容都是字串,scanf() 完成的是從字串中提取有效資料的過程。

連續讀取與讀取失敗問題

在本節第一段示例程式碼中,我們一個一個地輸入變數 a、b、c、d 的值,也就是說,每輸入一個值就按一次回車鍵。現在我們改變輸入方式,將四個變數的值一次性輸入,如下所示:

12 60 10 23↙

a+b=72

c*d=230

可以發現,scanf() 也能正確讀取。合情合理地猜測是,scanf() 沒有拋棄多餘的值,而是將它們儲存在了某個地方,下次接著使用。

請大家繼續看下面的程式碼:

#include#includeint main(){ int a=0, b=0; scanf("a=%d", &a); scanf("b=%d", &b); printf("a=%d, b=%d", a, b); system("pause"); return 0;}

執行結果:

a=100↙

a=100, b=0

第一個 scanf() 能夠正確讀取到整數並賦值給變數 a,第二個 scanf() 好像被忽略了,什麼也沒做,b 的值沒有發生變化。

這兩個問題都和C語言輸入緩衝區有關,我們將在《C語言緩衝區(快取)詳解》《結合C語言緩衝區談scanf()函式》《C語言清空緩衝區》幾節詳細講解。

輸入單個字元

scanf 用於接收使用者輸入的各種資料,如果僅僅是輸入單個字元,也可以使用 get)、getche() 或 getch()。

get) 使用示例:

#include#includeint main(){ char c; c=get); printf("c='%c'", c); system("pause"); return 0;}

執行結果:

#↙

c='#'

你也可以將第5、6行的語句合併為一個:

char c = get);

getche() 使用示例:

#include#include#includeint main(){ char c=getche(); printf("c='%c'", c); system("pause"); return 0;}

執行結果:

#c='#'

大家親自執行程式會發現,剛輸入字元 #,getche() 就立即獲取,不會等到使用者按下回車鍵,所以執行結果中沒有換行。而 get) 不是,它要等到使用者按下回車鍵才能確認輸入結束,所以執行結果中有換行。

getch() 使用示例:

#include#include#includeint main(){ char c=getch(); printf("c='%c'", c); system("pause"); return 0;}

執行程式,輸入 #,結果為:

c='#'

大家親自執行程式會發現,getch() 和 getche() 類似,輸入一個字元就立即獲取,不會等待使用者按下回車鍵。與 getche() 不同的是,getch() 輸入的 # 並沒有顯示出來。

在C語言中,將使用者輸入的內容顯示在螢幕上叫做回顯(Echo)。get)、getche() 是有回顯的,而 getch() 沒有回顯。

回顯在大部分情況下是有必要的,它能夠與使用者及時互動,讓使用者清楚地看到自己輸入的內容。但在某些特殊情況下,我們卻不希望有回顯,例如輸入密碼,有回顯是非常危險的,容易被偷窺。

從本質上講,getch()、getche() 立即回顯是因為它們不帶緩衝區,而 get) 帶有緩衝區,必須等待使用者按下回車鍵才能確認輸入結束,更多內容將在《結合C語言緩衝區談get)、getche()、getch()》一節詳細講解。

另外需要注意的是:get) 位於 stdio.h 標頭檔案中,是C語言規定的標準函式;而 getche()、getch() 位於 conio.h 中,它們都不是標準函式,不保證在任何編譯器下都有效。

輸入字串

這裡由於大家的基礎知識還不夠,沒有學到陣列和指標,暫時無法深入講解。下面僅作一個演示:

#include#include#includeint main(){ char str1[30], str2[30]; //定義兩個字元陣列 gets(str1); scanf("%s", str2); puts(str1); puts(str2); system("pause"); return 0;}

執行結果:

The world is beautiful!↙

Hello World!↙

The world is beautiful!

Hello

gets() 會讀取使用者輸入的整行內容,包括空格。而 scanf() 遇到空格就結束讀取,也就是說,使用 scanf() 讀取的字串中永遠不會包含空格。

TAG標籤:鍵盤輸入 語言 #