日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言scanf:获取输入的内容

發布時間:2025/3/12 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言scanf:获取输入的内容 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

獲取外部輸入數據內容

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

scanf():和 printf() 類似,scanf() 可以輸入多種類型的數據。getchar()、getche()、getch():這三個函數都用于輸入單個字符。gets():獲取一行數據,并作為字符串處理。

scanf() 是最靈活、最復雜、最常用的輸入函數,但它不能完全取代其他函數。

scanf()函數

scanf 是 scan format 的縮寫,意思是格式化掃描,也就是從鍵盤獲得用戶輸入,和 printf 的功能正好相反。

我們先來看一個例子:

#include <stdio.h> int main() {int a = 0, b = 0, c = 0, d = 0;scanf("%d", &a); //輸入整數并賦值給變量ascanf("%d", &b); //輸入整數并賦值給變量bprintf("a+b=%d\n", a+b); //計算a+b的值并輸出scanf("%d %d", &c, &d); //輸入兩個整數并分別賦值給c、dprintf("c*d=%d\n", c*d); //計算c*d的值并輸出return 0; }

運行結果:

1260↙ a+b=72 10 23↙ c*d=230 ↙表示按下回車鍵。

從鍵盤輸入12,按下回車鍵,scanf() 就會讀取輸入數據并賦值給變量 a;本次輸入結束,接著執行下一個 scanf() 函數,再從鍵盤輸入 60,按下回車鍵,就會將 60 賦值給變量 b,都是同樣的道理。

第 8 行代碼中,scanf() 有兩個以空格分隔的%d,后面還跟著兩個變量,這要求我們一次性輸入兩個整數,并分別賦值給 c 和 d。注意"%d %d"之間是有空格的,所以輸入數據時也要有空格。對于 scanf(),輸入數據的格式要和控制字符串的格式保持一致。

其實 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 <stdio.h> int main() {int a='F';int b=12;int c=452;printf("&a=%p, &b=%p, &c=%p\n", &a, &b, &c);return 0; }

輸出結果:

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

%p是一個新的格式控制符,它表示以十六進制的形式(帶小寫的前綴)輸出數據的地址。如果寫作%P,那么十六進制的前綴也將變成大寫形式。

注意:這里看到的地址都是假的,是虛擬地址,并不等于數據在物理內存中的地址。虛擬地址是現代計算機因內存管理的需要才提出的概念。

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

運行結果:

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 的值,每輸入一個值就按一次回車鍵?,F在我們改變輸入方式,將四個變量的值一次性輸入,如下所示:

12 60 10 23↙ a+b=72 c*d=230

可以發現,兩個 scanf() 都能正確讀取。合情合理的猜測是,第一個 scanf() 讀取完畢后沒有拋棄多余的值,而是將它們保存在了某個地方,下次接著使用。

如果我們多輸入一個整數,會怎樣呢?

12 60 10 23 99↙ a+b=72 c*d=230

這次我們多輸入了一個 99,發現 scanf() 仍然能夠正確讀取,只是 99 沒用罷了。

如果我們少輸入一個整數,又會怎樣呢?

12 60 10↙ a+b=72 23↙ c*d=230

輸入三個整數后,前兩個 scanf() 把前兩個整數給讀取了,剩下一個整數 10,而第三個 scanf() 要求輸入兩個整數,一個單獨的 10 并不能滿足要求,所以我們還得繼續輸入,湊夠兩個整數以后,第三個 scanf() 才能讀取完畢。

我們從鍵盤輸入的數據并沒有直接交給 scanf(),而是放入了緩沖區中,直到我們按下回車鍵,scanf() 才到緩沖區中讀取數據。如果緩沖區中的數據符合 scanf() 的要求,那么就讀取結束;如果不符合要求,那么就繼續等待用戶輸入,或者干脆讀取失敗。

注意,如果緩沖區中的數據不符合 scanf() 的要求,要么繼續等待用戶輸入,要么就干脆讀取失敗,上面我們演示了“繼續等待用戶輸入”的情形,下面我們對代碼稍作修改,演示“讀取失敗”的情形。

#include <stdio.h> int main() {int a = 1, b = 2, c = 3, d = 4; //修改處:給變量賦予不同的初始值scanf("%d", &a);scanf("%d", &b);printf("a=%d, b=%d\n", a, b);scanf("%d %d", &c, &d);printf("c=%d, d=%d\n", c, d);return 0; }

運行結果:

12 60 a10↙ a=12, b=60 c=3, d=4

前兩個整數被正確讀取后,剩下了 a10,而第三個 scanf() 要求輸入兩個十進制的整數,a10 無論如何也不符合要求,所以只能讀取失敗。輸出結果也證明了這一點,c 和 d 的值并沒有被改變。

scanf() 不會跳過不符合要求的數據,遇到不符合要求的數據會讀取失敗,而不是再繼續等待用戶輸入。

正是由于緩沖區的存在,才使得我們能夠多輸入一些數據,或者一次性輸入所有數據,這可以認為是緩沖區的一點優勢。然而,緩沖區也帶來了一定的負面影響,如下所示。

#include <stdio.h> int main() {int a = 1, b = 2;scanf("a=%d", &a);scanf("b=%d", &b);printf("a=%d, b=%d\n", a, b);return 0; }

輸入示例:

a=99↙ a=99, b=2

輸入a=99,按下回車鍵,程序竟然運行結束了,只有第一個 scanf() 成功讀取了數據,第二個 scanf() 仿佛沒有執行一樣,根本沒有給用戶任何機會去輸入數據。

如果我們換一種輸入方式呢?

a=99b=200↙ a=99, b=200

這樣 a 和 b 都能夠正確讀取了。注意,a=99b=200中間是沒有任何空格的。

肯定有好奇的小伙伴又問了,**如果a=99b=200兩個數據之間有空格又會怎么樣呢?**我們不妨親試一下:

a=99 b=200↙ a=99, b=2

第二個 scanf() 又讀取失敗了!在前面的例子中,輸入的兩份數據之前都是有空格的呀,為什么這里不能帶空格呢,真是匪夷所思。這個其實還是跟緩沖區有關系。

要想破解 scanf() 輸入的問題,一定要學習緩沖區,它能使你對輸入輸出的認識上升到一個更高的層次,以后不管遇到什么疑難雜癥,都能迎刃而解??梢哉f,輸入輸出的“命門”就在于緩沖區。

輸入其它數據

除了輸入整數,scanf() 還可以輸入單個字符、字符串、小數等,請看下面的演示:

#include <stdio.h> int main() {char letter;int age;char url[30];float price;scanf("%c", &letter);scanf("%d", &age);scanf("%s", url); //可以加&也可以不加&scanf("%f", &price);printf("26個英文字母的最后一個是 %c。\n", letter);printf("百度已經建立%d年了,網址是 %s,商品價格是%g。\n", age, url, price);return 0; }

運行示例:

z↙ 6↙ http://www.baidu.com↙ 160.526個英文字母的最后一個是 z。 百度已經建立6年了,網址是 http://www.baidu.com,商品價格是160.5

scanf() 和 printf() 雖然功能相反,但是格式控制符是一樣的,單個字符、整數、小數、字符串對應的格式控制符分別是 %c、%d、%f、%s。

讀取字符串

字符串的兩種定義形式,它們分別是:

char str1[] = "http://www.baidu.com"; char *str2 = "百度";

這兩種形式其實是有區別的,第一種形式的字符串所在的內存既有讀取權限又有寫入權限,第二種形式的字符串所在的內存只有讀取權限,沒有寫入權限。printf()、puts() 等字符串輸出函數只要求字符串有讀取權限,而 scanf()、gets() 等字符串輸入函數要求字符串有寫入權限,所以,第一種形式的字符串既可以用于輸出函數又可以用于輸入函數,而第二種形式的字符串只能用于輸出函數。

另外,對于第一種形式的字符串,在[ ]里面要指明字符串的最大長度,如果不指明,也可以根據=后面的字符串來自動推算,此處,就是根據"http://www.baidu.com"的長度來推算的。但是在前一個例子中,開始我們只是定義了一個字符串,并沒有立即給它賦值,所以沒法自動推算,只能手動指明最大長度,這也就是為什么一定要寫作char url[30],而不能寫作char url[]的原因。

讀者還要注意第 11 行代碼,這行代碼用來輸入字符串。上面我們說過,scanf() 讀取數據時需要的是數據的地址,整數、小數、單個字符都要加&取地址符,這很容易理解;但是對于此處的 url 字符串,我們并沒有加 &,這是因為,字符串的名字會自動轉換為字符串的地址,所以不用再多此一舉加 & 了。

特別注意,scanf() 讀取字符串時以空格為分隔,遇到空格就認為當前字符串結束了,所以無法讀取含有空格的字符串,請看下面的例子:

#include <stdio.h> int main() {char author[30], lang[30], url[30];scanf("%s %s", author, lang);printf("author:%s \nlang: %s\n", author, lang);scanf("%s", url);printf("url: %s\n", url);return 0; }

運行示例:

ZHANGSHUHANG C-Language↙ author:ZHANGSHUHANG lang: C-Language http://www.baidu.com http://baidu.com↙ url: http://www.baidu.com

對于第一個 scanf(),它將空格前邊的字符串賦值給 author,將空格后邊的字符串賦值給 lang;很顯然,第一個字符串遇到空格就結束了,第二個字符串到了本行的末尾結束了。

或許第二個 scanf() 更能說明問題,我們輸入了兩個網址,但是 scanf() 只讀取了一個,就是因為這兩個網址以空格為分隔,scanf() 遇到空格就認為字符串結束了,不再繼續讀取了。

scanf() 格式控制符匯總


你的點贊是對我最大的支持!!!

總結

以上是生活随笔為你收集整理的C语言scanf:获取输入的内容的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。