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
電資鼠 - 您的學習好夥伴
20會員
242內容數
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 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
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
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