亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語(yǔ)言

C語(yǔ)言從鍵盤輸入數(shù)據(jù)

時(shí)間:2024-10-25 00:40:47 C語(yǔ)言 我要投稿
  • 相關(guān)推薦

C語(yǔ)言從鍵盤輸入數(shù)據(jù)

  程序是人機(jī)交互的媒介,有輸出必然也有輸入。下面是小編分享的C語(yǔ)言從鍵盤輸入數(shù)據(jù)的知識(shí),歡迎大家參考!

C語(yǔ)言從鍵盤輸入數(shù)據(jù)

  在C語(yǔ)言中,有多個(gè)函數(shù)可以從鍵盤獲得用戶輸入:

  scanf():和 printf() 類似,scanf() 可以輸入多種類型的數(shù)據(jù)。

  get)、getche()、getch():這三個(gè)函數(shù)都用于輸入單個(gè)字符。

  gets():獲取一行數(shù)據(jù),并作為字符串處理。

  scanf() 是最靈活、最復(fù)雜、最常用的輸入函數(shù),但它不能完全取代其他函數(shù),大家都要有所了解。

  scanf()函數(shù)

  scanf 是 scan format 的縮寫,意思是格式化掃描,也就是從鍵盤獲得用戶輸入。我們先來(lái)看一個(gè)例子:

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

  運(yùn)行結(jié)果:

  12↙

  60↙

  a+b=72

  10 23↙

  c*d=230

  ↙表示按下回車鍵。

  從鍵盤輸入12,按下回車鍵,scanf() 就會(huì)讀取輸入數(shù)據(jù)并賦值給變量 a,本次輸入結(jié)束,執(zhí)行下一條語(yǔ)句。接著給變量b賦值,也是同樣的道理。

  第9行代碼中,我們同時(shí)輸入兩個(gè)整數(shù)并分別賦值給c、d。注意"%d %d"之間是有空格的,所以輸入數(shù)據(jù)時(shí)也要有空格。也就是說(shuō),輸入數(shù)據(jù)的格式要和控制字符串的格式一致。

  scanf 和 printf 非常相似:

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

  它們都有格式控制字符串,都有變量列表。不同的是,scanf 的變量前要帶一個(gè)&符號(hào);&稱為取地址符,也就是獲取變量在內(nèi)存中的地址。

  在《二進(jìn)制思想以及數(shù)據(jù)的存儲(chǔ)》一節(jié)中講到,數(shù)據(jù)是以二進(jìn)制的形式保存在內(nèi)存中的,字節(jié)(Byte)是最小的可操作單位。為了便于管理,我們給每個(gè)字節(jié)分配了一個(gè)編號(hào),使用該字節(jié)時(shí),只要知道編號(hào)就可以,就像每個(gè)學(xué)生都有學(xué)號(hào),老師會(huì)隨機(jī)抽取學(xué)號(hào)來(lái)讓學(xué)生回答問(wèn)題。字節(jié)的編號(hào)是有順序的,從 0 開(kāi)始,接下來(lái)是 1、2、3……

  下圖是 4G 內(nèi)存中每個(gè)字節(jié)的編號(hào)(以十六進(jìn)制表示):

  這個(gè)編號(hào),就叫做地址(Address)。int a;會(huì)在內(nèi)存中分配四個(gè)字節(jié)的空間,我們將第一個(gè)字節(jié)的地址稱為變量 a 的地址,也就是&a的值。對(duì)于前面講到的整數(shù)、浮點(diǎn)數(shù)、字符,都要使用 & 獲取它們的地址,scanf 會(huì)根據(jù)地址把讀取到的數(shù)據(jù)寫入內(nèi)存。

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

  #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;}

  輸出結(jié)果:

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

  再來(lái)看一個(gè) 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;}

  運(yùn)行結(jié)果:

  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

  第一個(gè) scanf() 的格式控制字符串為"%d %d",中間有一個(gè)空格,而我們卻輸入了10 20,中間有多個(gè)空格。第二個(gè) scanf() 的格式控制字符串為"%d %d",中間有多個(gè)空格,而我們卻輸入了100 200,中間只有一個(gè)空格。這說(shuō)明 scanf() 對(duì)輸入數(shù)據(jù)之間的空格的處理比較寬松,并不要求空格數(shù)嚴(yán)格對(duì)應(yīng)。

  第三個(gè) scanf() 的控制字符串為"%d, %d, %d",中間以逗號(hào)分隔,所以輸入的整數(shù)也要以逗號(hào)分隔。

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

  每次用戶按下回車鍵,程序就會(huì)認(rèn)為用戶輸入結(jié)束,scanf() 開(kāi)始讀取用戶輸入的內(nèi)容,并根據(jù)格式控制字符串從中提取數(shù)據(jù),只要用戶輸入的內(nèi)容和格式控制字符串匹配,就能夠正確提取。

  本質(zhì)上講,用戶輸入的內(nèi)容都是字符串,scanf() 完成的是從字符串中提取有效數(shù)據(jù)的過(guò)程。

  連續(xù)讀取與讀取失敗問(wèn)題

  在本節(jié)第一段示例代碼中,我們一個(gè)一個(gè)地輸入變量 a、b、c、d 的值,也就是說(shuō),每輸入一個(gè)值就按一次回車鍵,F(xiàn)在我們改變輸入方式,將四個(gè)變量的值一次性輸入,如下所示:

  12 60 10 23↙

  a+b=72

  c*d=230

  可以發(fā)現(xiàn),scanf() 也能正確讀取。合情合理地猜測(cè)是,scanf() 沒(méi)有拋棄多余的值,而是將它們保存在了某個(gè)地方,下次接著使用。

  請(qǐng)大家繼續(xù)看下面的代碼:

  #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;}

  運(yùn)行結(jié)果:

  a=100↙

  a=100, b=0

  第一個(gè) scanf() 能夠正確讀取到整數(shù)并賦值給變量 a,第二個(gè) scanf() 好像被忽略了,什么也沒(méi)做,b 的值沒(méi)有發(fā)生變化。

  這兩個(gè)問(wèn)題都和C語(yǔ)言輸入緩沖區(qū)有關(guān),我們將在《C語(yǔ)言緩沖區(qū)(緩存)詳解》《結(jié)合C語(yǔ)言緩沖區(qū)談scanf()函數(shù)》《C語(yǔ)言清空緩沖區(qū)》幾節(jié)詳細(xì)講解。

  輸入單個(gè)字符

  scanf 用于接收用戶輸入的各種數(shù)據(jù),如果僅僅是輸入單個(gè)字符,也可以使用 get)、getche() 或 getch()。

  get) 使用示例:

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

  運(yùn)行結(jié)果:

  #↙

  c='#'

  你也可以將第5、6行的語(yǔ)句合并為一個(gè):

  char c = get);

  getche() 使用示例:

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

  運(yùn)行結(jié)果:

  #c='#'

  大家親自運(yùn)行程序會(huì)發(fā)現(xiàn),剛輸入字符 #,getche() 就立即獲取,不會(huì)等到用戶按下回車鍵,所以運(yùn)行結(jié)果中沒(méi)有換行。而 get) 不是,它要等到用戶按下回車鍵才能確認(rèn)輸入結(jié)束,所以運(yùn)行結(jié)果中有換行。

  getch() 使用示例:

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

  運(yùn)行程序,輸入 #,結(jié)果為:

  c='#'

  大家親自運(yùn)行程序會(huì)發(fā)現(xiàn),getch() 和 getche() 類似,輸入一個(gè)字符就立即獲取,不會(huì)等待用戶按下回車鍵。與 getche() 不同的是,getch() 輸入的 # 并沒(méi)有顯示出來(lái)。

  在C語(yǔ)言中,將用戶輸入的內(nèi)容顯示在屏幕上叫做回顯(Echo)。get)、getche() 是有回顯的,而 getch() 沒(méi)有回顯。

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

  從本質(zhì)上講,getch()、getche() 立即回顯是因?yàn)樗鼈儾粠Ь彌_區(qū),而 get) 帶有緩沖區(qū),必須等待用戶按下回車鍵才能確認(rèn)輸入結(jié)束,更多內(nèi)容將在《結(jié)合C語(yǔ)言緩沖區(qū)談get)、getche()、getch()》一節(jié)詳細(xì)講解。

  另外需要注意的是:get) 位于 stdio.h 頭文件中,是C語(yǔ)言規(guī)定的標(biāo)準(zhǔn)函數(shù);而 getche()、getch() 位于 conio.h 中,它們都不是標(biāo)準(zhǔn)函數(shù),不保證在任何編譯器下都有效。

  輸入字符串

  這里由于大家的基礎(chǔ)知識(shí)還不夠,沒(méi)有學(xué)到數(shù)組和指針,暫時(shí)無(wú)法深入講解。下面僅作一個(gè)演示:

  #include#include#includeint main(){ char str1[30], str2[30]; //定義兩個(gè)字符數(shù)組 gets(str1); scanf("%s", str2); puts(str1); puts(str2); system("pause"); return 0;}

  運(yùn)行結(jié)果:

  The world is beautiful!↙

  Hello World!↙

  The world is beautiful!

  Hello

  gets() 會(huì)讀取用戶輸入的整行內(nèi)容,包括空格。而 scanf() 遇到空格就結(jié)束讀取,也就是說(shuō),使用 scanf() 讀取的字符串中永遠(yuǎn)不會(huì)包含空格。

【C語(yǔ)言從鍵盤輸入數(shù)據(jù)】相關(guān)文章:

C語(yǔ)言實(shí)型數(shù)據(jù)07-02

C語(yǔ)言字符型數(shù)據(jù)09-23

C語(yǔ)言整型數(shù)據(jù)分析09-07

C語(yǔ)言字符數(shù)據(jù)的合法形式10-17

C語(yǔ)言的數(shù)據(jù)類型介紹07-16

C語(yǔ)言的數(shù)據(jù)類型有哪些10-11

C語(yǔ)言數(shù)據(jù)輸出及輕量進(jìn)階10-13

C語(yǔ)言數(shù)據(jù)的輸入輸出復(fù)習(xí)08-11

C語(yǔ)言學(xué)習(xí)關(guān)于數(shù)據(jù)的介紹10-21

C語(yǔ)言基礎(chǔ)之?dāng)?shù)據(jù)類型轉(zhuǎn)換09-23