C語言自學攻略-scanf()進階用法解析

更新於 發佈於 閱讀時間約 3 分鐘

在C語言中,scanf()可能並沒有我們所想的那麼簡單且單調,下面我就列出4點補充的使用方式。

  1. 只讀取數字並判斷範圍(下面以 0-8 為例):
#include <stdio.h>
int main() {
char digits[20]; // 宣告字元陣列,用來存放一連串的字元。

printf("請輸入一串數字: ");
scanf("%[0-8]", digits); // 只讀取數字 0-8,直到遇到9或非數字
printf("您輸入的數字是: %s\n", digits);

return 0;
}
/* 輸出
請輸入一串數字: 123456789
您輸入的數字是: 12345678

請輸入一串數字: 12345abc678
您輸入的數字是: 12345
*/

解釋

  • 由於 scanf("%[0-8]", digits); 只會讀取 0-8 的數字,所以當遇到 9 或 a 字母時,scanf 會停止讀取(也就是不會讀取)。

  1. 讀取 A-Z, a-z, 0-9(字母和數字):
#include <stdio.h>
int main() {
char alnum[50];

printf("請輸入字母和數字的組合: ");
scanf("%[A-Za-z0-9]", alnum); // 只讀取大小寫字母和數字
printf("您輸入的字母和數字是: %s\n", alnum);

return 0;
}
/* 輸出
請輸入字母和數字的組合: Ab3#Bc4
您輸入的字母和數字是: Ab3
*/

解釋

  • scanf("%[A-Za-z0-9]", alnum); 讀取遇到非A-Z、a-z、0-9的字符時,scanf 會停止讀取(也就是不會讀取)。

  1. 讀取某些字元以外的所有字元(本例子為讀取 ABC 字元以外的所有字元):
#include <stdio.h>
int main() {
char digits[20];

printf("請輸入一串數字: ");
scanf("%[^ABC]", digits); // 格式長這樣,添加一個 "^"
printf("您輸入的數字是: %s\n", digits);

return 0;
}
/* 輸出
請輸入一串數字: #1@aB
您輸入的數字是: #1@a
*/

解釋

  • scanf("%[^ABC]", digits); 表示只讀取ABC以外的所有字元,直到遇到ABC其中一個,scanf 會停止讀取(也就是不會讀取)。

  1. 預防scanf收到的字元超出字串範圍。

預防的方法之一是,限定 scanf 每次執行可以接受的最大字元數,例如:

#include <stdio.h>

int main() {
char test[10];

printf("請輸入字串:");
scanf("%9s",test);
printf("輸入的字串:%s\n",test);

return 0;
}

在上面的例子中,"%9s"的意思是: 就算輸入的字元數超過 9,buf 也只會收到 9 個字元,超過的字元會留在輸入緩衝區內。而這邊要注意一個非常重要的觀念,就是 scanf()自動在最後加上 '\0',使其成為正確的 C 語言字串(以後的章節還會提到)


  • 輸入緩衝區會在下一個單元提到。

而另一個預防輸入超過 test 長度的方式,是使用 fgets (一樣下一章會提到)。

留言
avatar-img
留言分享你的想法!
avatar-img
電資鼠 - 您的學習好夥伴
8會員
206內容數
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 C/C++、Python、數位邏輯、電路學與嵌入式開發等大學電資領域的課程,正是進入這個高薪、高需求產業的關鍵!
2025/03/07
本章節將探討左下三角稀疏矩陣。
Thumbnail
2025/03/07
本章節將探討左下三角稀疏矩陣。
Thumbnail
2025/03/07
相信讀者現在對於鏈結串列有了更多的認識,所以我再進一步,示範更多關於鏈結串列的操作,這部分示範會將程式模組化。將鏈結串列的操作寫進一個標頭檔,並在主程式中引入。
Thumbnail
2025/03/07
相信讀者現在對於鏈結串列有了更多的認識,所以我再進一步,示範更多關於鏈結串列的操作,這部分示範會將程式模組化。將鏈結串列的操作寫進一個標頭檔,並在主程式中引入。
Thumbnail
2025/03/07
本章節示範透過「陣列索引」和「指標運算」兩種方式來存取同一個二維陣列 a,並印出相同的數值以及對應的位址,以說明它們其實指向的是同一塊連續的記憶體空間。本文將依序解釋各段程式碼,並示範可能的執行結果與背後原理。
Thumbnail
2025/03/07
本章節示範透過「陣列索引」和「指標運算」兩種方式來存取同一個二維陣列 a,並印出相同的數值以及對應的位址,以說明它們其實指向的是同一塊連續的記憶體空間。本文將依序解釋各段程式碼,並示範可能的執行結果與背後原理。
Thumbnail
看更多
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
中學數學基礎練習—分數計算
Thumbnail
中學數學基礎練習—分數計算
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
高中數學主題練習—對數方程式
Thumbnail
C 語言的函式庫定義了許多好用的函式,在寫 C++ 的時候可以拿來用。這是因為 C++ 當初在設計的時候,就有刻意把 C 涵蓋進來。 基本用法 首先要導入 C 語言的標準函式庫: #include <cstdlib> 以 c 作為開頭表示它是 C 語言的函式庫,只是被我們拿來 C++ 的程式
Thumbnail
C 語言的函式庫定義了許多好用的函式,在寫 C++ 的時候可以拿來用。這是因為 C++ 當初在設計的時候,就有刻意把 C 涵蓋進來。 基本用法 首先要導入 C 語言的標準函式庫: #include <cstdlib> 以 c 作為開頭表示它是 C 語言的函式庫,只是被我們拿來 C++ 的程式
Thumbnail
高中數學主題練習—C計算(一)
Thumbnail
高中數學主題練習—C計算(一)
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News