在C語言中,scanf()
可能並沒有我們所想的那麼簡單且單調,下面我就列出4點補充的使用方式。
#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
會停止讀取(也就是不會讀取)。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
會停止讀取(也就是不會讀取)。字元以外
的所有字元(本例子為讀取 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
會停止讀取(也就是不會讀取)。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
(一樣下一章會提到)。