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
電資鼠 - 您的學習好夥伴
13會員
222內容數
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 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
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
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++ 的程式
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News