C語言從鍵盤輸入數據

分類:編程 時間:2016-11-02
[摘要:順序是人機交互的前言,有輸出幸免也有輸進。正在C說話中,有多個函數能夠從鍵盤取得用戶輸進: scanf():戰 printf() 類似,scanf() 能夠輸進多品種型的數據。getchar()]

程序是人機交互的媒介,有輸出必然也有輸入。在C語言中,有多個函數可以從鍵盤獲得用戶輸入:
  • scanf():和 printf() 類似,scanf() 可以輸入多種類型的數據。
  • getchar()getche()getch():這三個函數都用於輸入單個字符。
  • gets():獲取一行數據,並作為字符串處理。

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

scanf()函數

scanf 是 scan format 的縮寫,意思是格式化掃描,也就是從鍵盤獲得用戶輸入。我們先來看一個例子:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int a, b, c, d;
  6. scanf("%d", &a); //輸入整數並賦值給變量a
  7. scanf("%d", &b); //輸入整數並賦值給變量b
  8. printf("a+b=%d\n", a+b); //計算a+b的值
  9. scanf("%d %d", &c, &d); //輸入兩個整數並分別賦值給c、d
  10. printf("c*d=%d\n", c*d); //計算c*d的值
  11. system("pause");
  12. return 0;
  13. }
運行結果:
12↙
60↙
a+b=72
10 23↙
c*d=230
表示按下回車鍵。
從鍵盤輸入12,按下回車鍵,scanf() 就會讀取輸入數據並賦值給變量 a,本次輸入結束,執行下一條語句。接著給變量b賦值,也是同樣的道理。

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

scanf 和 printf 非常相似:
  1. scanf("%d %d", &a, &b); // 獲取用戶輸入的兩個整數,分別賦值給變量 a 和 b
  2. printf("%d %d", a, b); // 將變量 a 和 b 的是在顯示器上輸出。
它們都有格式控制字符串,都有變量列表。不同的是,scanf 的變量前要帶一個&符號;&稱為取地址符,也就是獲取變量在內存中的地址。

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

下圖是 4G 內存中每個字節的編號(以十六進制表示):
\

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

我們不妨將它們的地址輸出看一下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int a='F';
  6. int b=12;
  7. int c=452;
  8. printf("&a=%#x, &b=%#x, &c=%#x\n", &a, &b, &c);
  9. system("pause");
  10. return 0;
  11. }
輸出結果:
&a=0x18ff48, &b=0x18ff44, &c=0x18ff40

\
圖:a、b、c 的內存地址
註意:你看到的地址是虛擬地址,並不等於它在物理內存中的地址。虛擬內存是現代操作系統因內存管理的需要才提出的概念,dos 下沒有這個概念,用戶看到的都是真實的地址。CPU 操作的是物理內存地址,所以虛擬地址必須經過轉換才能交給 CPU,這是 OS 的工作,對用戶是透明的。
再來看一個 scanf 的例子:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int a, b, c;
  6. scanf("%d %d", &a, &b);
  7. printf("a+b=%d\n", a+b);
  8. scanf("%d %d", &a, &b);
  9. printf("a+b=%d\n", a+b);
  10. scanf("%d, %d, %d", &a, &b, &c);
  11. printf("a+b+c=%d\n", a+b+c);
  12. scanf("%d is bigger than %d", &a, &b);
  13. printf("a-b=%d\n", a-b);
  14. system("pause");
  15. return 0;
  16. }
運行結果:
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() 完成的是從字符串中提取有效數據的過程。

輸入單個字符

scanf 用於接收用戶輸入的各種數據,如果僅僅是輸入單個字符,也可以使用 getchar()、getche() 或 getch()。

getchar() 使用示例:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. char c;
  6. c=getchar();
  7. printf("c='%c'\n", c);
  8. system("pause");
  9. return 0;
  10. }
運行結果:
#↙
c='#'

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

char c = getchar();


getche() 使用示例:
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. int main()
  5. {
  6. char c=getche();
  7. printf("c='%c'\n", c);
  8. system("pause");
  9. return 0;
  10. }
運行結果:
#c='#'

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

getch() 使用示例:
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. int main()
  5. {
  6. char c=getch();
  7. printf("c='%c'\n", c);
  8. system("pause");
  9. return 0;
  10. }
運行程序,輸入 #,結果為:
c='#'

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

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

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

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

輸入字符串

這裏由於大家的基礎知識還不夠,沒有學到數組和指針,暫時無法深入講解。下面僅作一個演示:
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <stdlib.h>
  4. int main()
  5. {
  6. char str1[30], str2[30]; <
    Tags: include system return C語言 字符串

    文章來源:


ads
ads

相關文章
ads

相關文章

ad