書名: 高效微控制器C語言編程作者名: (美)馬克·盧瓦本章字數: 1756字更新時間: 2025-06-05 13:36:27
2.2.1 獲取用戶輸入
我們很快就會探討定義和初始化變量的細節,但讓我們先運行一下為用戶獲取一些輸入來創建動態輸出的想法,而無須每次都重新編譯程序。我們將回到“Hello,World”程序,并稍微升級一下。我們可以讓用戶告訴我們他們的名字,然后親自向他們問好!
到目前為止,你已經看到了一個輸出語句,即我們用于問候的printf()函數調用。還有一個對應的輸入函數scanf()。你可以使用print/scan對來提示用戶,然后等待他們輸入答案。我們將答案存儲在一個變量中。如果你用其他語言編寫過程序,那么你對接下來的程序應該不會陌生。如果你是編程和C語言的新手,那么程序列表可能會有點密集或奇怪。沒關系!輸入這些程序,并在糾正錯別字后讓它們運行,是一種有用的學習方法。
很多編程都是經過深思熟慮的“剽竊”。這有點開玩笑,但也只是有點。編程的起點和人類學習口語的起點差不多:重復你看到(或聽到)的東西,但不一定了解它的一切。如果你重復的次數足夠多,你就會發現語言中固有的模式,并了解在哪些地方可以做出有用的改變。做出足夠多有用的改變,你就會發現如何從頭開始創造新的、有意義的東西。這就是我們的目標。
這個ch02/hello2.c程序只是你在探索編程道路上可以復制的另一段代碼:

希望這個程序的結構看起來似曾相識。我們包含了標準I/O庫,有一個main()函數,該函數有一個主體,在一對大括號內包含多個語句。不過,這個主體包含了幾個新項目。讓我們逐行查看。

下面是我們聲明變量的第一個示例。變量的名稱是“name”。它的類型是char,C語言用char來表示單個(ASCII)字符[1]。它也是一個數組,這意味著它可以依次存儲多個char值。在我們的例子中,可以存儲20個這樣的值。有關數組的更多信息,請參見第4章。現在只需注意,只要長度小于20個字符,該變量就可以保存一個人的姓名。

這是一個相當標準的printf()調用——與我們在1.2.2節中使用的第一個程序非常相似。唯一有意義的區別是雙引號內的最后一個字符。如果查看hello.c或verbose.c,你會發現最后兩個字符是反斜杠和字母“n”。這兩個字符的組合(\n)代表一個“換行”字符。如果在最后加上\n,就等于打印了一行,隨后對printf()的任何調用都將在下一行進行。相反,如果省略\n,終端中的光標就會停留在當前行上。如果你想打印一個表格,但每次只打印一個表格單元格,這就很方便了。或者,在我們的例子中,如果你想提示用戶輸入一些信息,然后允許他們在問題的同一行輸入他們的回答。

這就是我在本節開頭提到的新函數。函數scanf()可以“掃描”字符,并將其轉換為C數據類型,如數字,或者本例中的字符數組。轉換完成后,scanf()會將每個“東西”存儲到一個變量中。因此,在這一行中,我們正在掃描一堆字符,并將它們存儲到name變量中。我們將在2.3節中看看括號內的東西的奇怪語法。

最后,我們要打印問候語。同樣,這看起來應該很熟悉,但現在我們有了更多奇怪的語法。如果%s與調用scanf()時的奇怪內容一樣,那么恭喜你!你剛剛發現了一個非常有用的模式。這對字符正是C語言在打印或掃描字符數組時使用的字符。在C語言中,字符數組是一種非常常見的類型,因此它有一個更簡單的名字:字符串。因此,在這對字符中使用了“s”。
那么name是怎么回事?掃描函數scanf()調用你輸入的任何名稱(不包括你按下的Return鍵[2])并將其存儲在內存中。我們的name變量包含這些字符的內存位置。當我們調用printf()時,我們的第一個參數("Well hello,%s!\n"部分)包含幾個字面字符,如“Well”一詞中的字符和一個字符串占位符(%s部分)。變量非常適合填充占位符。無論你輸入的是什么名稱,現在都會顯示出來。
請注意,我們在問候語中加入了特殊換行符。這意味著我們將打印問候語,然后按“Return”鍵,這樣終端中顯示的任何其他內容都將進入下一行。
讓我們運行程序,看看運行情況如何。你可以使用VS Code底部的“終端”選項卡,或者你平臺上的“終端”或“命令”應用程序。你需要先用gcc進行編譯,然后使用-o選項運行a.out或任何你選擇的名稱。你應該會得到與圖2-1類似的結果。

圖2-1:我們定制的Hello World輸出
請注意,當你輸入一個名稱時,它會與要求你輸入的提示出現在同一行。這正是我們省略換行符時想要的結果。但請嘗試再次運行并輸入不同的名稱。你得到預期的結果了嗎?再試第三次。這種響應用戶輸入的動態行為使得變量在計算機編程中變得非常寶貴。同一個程序可以根據不同的輸入產生不同的輸出,而無須重新編譯。這種能力反過來又使計算機程序成為我們日常生活中不可或缺的。
- C++ Primer習題集(第5版)
- JavaScript百煉成仙
- Java范例大全
- Python量化投資指南:基礎、數據與實戰
- Arduino by Example
- 劍指Offer(專項突破版):數據結構與算法名企面試題精講
- CentOS 7 Linux Server Cookbook(Second Edition)
- 深入淺出Spring Boot 2.x
- C語言程序設計案例式教程
- JavaScript by Example
- 快速念咒:MySQL入門指南與進階實戰
- C語言程序設計學習指導與習題解答
- Visual Basic程序設計實驗指導(第二版)
- jQuery Mobile移動應用開發實戰(第3版)
- 小程序,巧應用:微信小程序開發實戰(第2版)