一把梭系列 ~ C語言範例 (0006) [printf 與 scanf 分析說明]
資料來源: https://openhome.cc/Gossip/CGossip/PrintfScanf.html
https://www.cplusplus.com/reference/cstdio/fflush/
★前言
★主題:
00.C語言 主控台(console mode) 標準輸出函數庫
學習 C 的過程中,通常是從主控台,也就是文字模式下開始,為了與程式互動,在主控台下輸出程式執行結果,或是從主控台取得使用者的輸入資料是基本需求,在 C 中標準輸入輸出是由 stdio.h 提供,這也就是為何要在程式的一開頭總是加上:
#include
01.C語言 主控台(console mode) 標準輸出函數 ~ printf
printf 時要指定整數、浮點數、字元等進行顯示控制時,要配合格式指定字(format specifier)才可達到,以下列出幾個可用的格式指定碼:
\t:產生Tab空格
\n:產生換行
%c:以字元方式輸出
%d:10 進位(進制)整數輸出
%o:以 8 進位(進制)整數方式輸出
%x、%X:將整數以 16 進位(進制)方式輸出
%u:無號整數輸出
%f:浮點數輸出
%±m.nf:浮點數輸出,m整數位數;n小數位數;± 靠左/靠右對其方向
%*:預留N個字元寬度 (數值和對字串類型 可以更長)
%.*:限制N個字元寬度 (對字串類型 不可更長)
%e、%E:使用科學記號顯示浮點數
%g、%G:浮點數輸出,取 %f 或 %e(%f 或 %E),看哪個表示精簡
%%:顯示 %
%s:字串輸出
%lu:long unsigned 型態的整數
%p:指標型態
02.C語言 主控台(console mode) 標準輸入函數 ~ scanf
scanf 時要指定整數、浮點數、字元等進行輸入控制,要配合格式指定字(format specifier)才可達到,以下列出幾個可用的格式指定碼:
%c:以字元方式輸入
%d:整數輸入
%f:浮點數輸入
%g:浮點數輸入
%s:字串輸入
%d %d:兩個數字,中間使用空白區隔
%d-%d:兩個數字,中間使用-號區隔
%ns:若輸入的字元超過 n,buf 也只會收到 n 個字元加上一個空字元,超過的字元會留在輸入緩衝區。
支援正則(正規)表達式
%[1-5]:限制輸入1 到 5 的字元
%[XYZ]:限制輸入輸入 XYZ 任其中的字元
★code
#include#include int main() { /* printf 時要指定整數、浮點數、字元等進行顯示,要配合格式指定字(format specifier),以下列出幾個可用的格式指定碼: %c:以字元方式輸出 %d:10 進位(進制)整數輸出 %o:以 8 進位(進制)整數方式輸出 %x、%X:將整數以 16 進位(進制)方式輸出 %u:無號整數輸出 %f:浮點數輸出 %±m.nf:浮點數輸出,m整數位數;n小數位數;± 靠左/靠右對其方向 %*:預留N個字元寬度 (數值和對字串類型 可以更長) %.*:限制N個字元寬度 (對字串類型 不可更長) %e、%E:使用科學記號顯示浮點數 %g、%G:浮點數輸出,取 %f 或 %e(%f 或 %E),看哪個表示精簡 %%:顯示 % %s:字串輸出 %lu:long unsigned 型態的整數 %p:指標型態 */ printf("顯示字元 %c\n", 'A'); printf("顯示字元編碼 %d\n", 'A'); printf("顯示字元編碼 %c\n", 65); printf("顯示十進位整數 %d\n", 15); printf("顯示八進位整數 %o\n", 15); printf("顯示十六進位整數 %X\n", 15); printf("顯示十六進位整數 %x\n", 15); printf("顯示科學記號 %E\n", 0.001234); printf("顯示科學記號 %e\n", 0.001234); printf("-----------\n"); printf("example:%.2f\n", 19.234); printf("example:%6.2f\n", 19.234); printf("example:%-6.2f\n", 19.234); printf("-----------\n"); printf("%*d\n", 1, 19); printf("%*d\n", 2, 19); printf("%*d\n", 3, 19); printf("%*d\n", 2, 190); printf("-----------\n"); printf("%.*d\n", 1, 20); printf("%.*d\n", 2, 20); printf("%.*d\n", 3, 20); printf("%.*d\n", 2, 200); printf("-----------\n"); printf("%.*s\n", 4, "JashLiao"); printf("%.*s\n", 7, "JashLiao"); printf("%.*s\n", 8, "JashLiao"); printf("-----------\n"); printf("%*s\n", 4, "JashLiao"); printf("%*s\n", 7, "JashLiao"); printf("%*s\n", 8, "JashLiao"); /* scanf 時要指定整數、浮點數、字元等進行顯示,要配合格式指定字(format specifier),以下列出幾個可用的格式指定碼: %c:以字元方式輸入 %d:整數輸入 %f:浮點數輸入 %g:浮點數輸入 %s:字串輸入 %d %d:兩個數字,中間使用空白區隔 %d-%d:兩個數字,中間使用-號區隔 %ns:若輸入的字元超過 n,buf 也只會收到 n 個字元加上一個空字元,超過的字元會留在輸入緩衝區。 支援正則(正規)表達式 %[1-5]:限制輸入1 到 5 的字元 %[XYZ]:限制輸入輸入 XYZ 任其中的字元 */ printf("-----------\n"); int intbuf; printf("請輸入數字:"); scanf("%d", &intbuf);//請輸入數字:10 printf("你輸入的數字:%d\n", intbuf); printf("-----------\n"); int number1, number2; printf("請輸入兩個數字,中間使用空白區隔):"); scanf("%d %d", &number1, &number2);//請輸入兩個數字,中間使用空白區隔):10 20 printf("你輸入的數字:%d %d\n", number1, number2); printf("請再輸入兩個數字,中間使用-號區隔):");//請再輸入兩個數字,中間使用-號區隔):30-40 scanf("%d-%d", &number1, &number2); printf("你輸入的數字:%d-%d\n", number1, number2); printf("-----------\n"); fflush(stdin); // 清除輸入緩衝區 char buf50[50]; printf("請輸入 1 到 5 的字元:");//請輸入 1 到 5 的字元:1234432155556 scanf("%[1-5]", buf50); printf("輸入的字元為 %s\n", buf50); fflush(stdin); // 清除輸入緩衝區 printf("請輸入 XYZ 任一字元:");//請輸入 XYZ 任一字元:XXXXXXYYZZAAZZZZXXX scanf("%[XYZ]", buf50); printf("輸入的字元為 %s\n", buf50); printf("-----------\n"); fflush(stdin); // 清除輸入緩衝區 char buf10[10]; printf("請輸入字串:");//請輸入字串:1234567890 scanf("%9s", buf10); printf("輸入的字串:%s\n", buf10); return 0; } /* 執行結果文字備份 顯示字元 A 顯示字元編碼 65 顯示字元編碼 A 顯示十進位整數 15 顯示八進位整數 17 顯示十六進位整數 F 顯示十六進位整數 f 顯示科學記號 1.234000E-003 顯示科學記號 1.234000e-003 ----------- example:19.23 example: 19.23 example:19.23 ----------- 19 19 19 190 ----------- 20 20 020 200 ----------- Jash JashLia JashLiao ----------- JashLiao JashLiao JashLiao ----------- 請輸入數字:10 你輸入的數字:10 ----------- 請輸入兩個數字,中間使用空白區隔):10 20 你輸入的數字:10 20 請再輸入兩個數字,中間使用-號區隔):30-40 你輸入的數字:30-40 ----------- 請輸入 1 到 5 的字元:1234432155556 輸入的字元為 123443215555 請輸入 XYZ 任一字元:XXXXXXYYZZAAZZZZXXX 輸入的字元為 XXXXXXYYZZ ----------- 請輸入字串:1234567890 輸入的字串:123456789 */
★結果:
★延伸說明/重點回顧:
01.介紹了 C/C++ 中標準輸入/輸出(printf/scanf)的基本『格式指定碼』
02.使用『fflush(stdin);』可以清除標準輸入緩衝區(input buffer)
03.文中提及的『正則(正規)表達式』在實務操作上經常使用,有興趣的人可以在本部落格找到其他資訊