scanf() 函數用來格式化輸入數據,即按用戶指定的格式從鍵盤上把數據讀入到指定的變量中。其原型爲:
int scanf ( char * format [ ,argument, ... ]);
其調用格式爲: scanf("<格式化字符串>",<地址表>);
scanf()函數返回成功賦值的數據項數,出錯時則返回EOF
【參數】format爲格式化控制字符串,可以由三類字符構成。
1) 格式化說明符
格式字符 | 說明 |
%a %A | 讀入一個浮點值(僅C99有效) |
%c | 讀入一個字符 |
%d | 讀入十進制整數 |
%i | 讀入十進制,八進制,十六進制整數 |
%o | 讀入八進制整數 |
%x %X | 讀入十六進制整數 |
%s | 讀入一個字符串 |
%f %F | 讀入一個浮點數 |
%e %E | 讀入一個浮點數 |
%g %G | 讀入一個浮點數 |
%p | 讀入一個指針 |
%u | 讀入一個無符號十進制整數 |
%n | 至此已讀入值的等價字符數 |
%[] | 掃描字符集合 |
%% | 讀%符號 |
另外,還有附加格式說明字符,用於追加在上面的格式說明符後面。
修飾符 | 說明 |
L\l | 長度修飾符,輸入"長"數據 |
h | 長度修飾符,輸入"短"數據 |
W | 整型常數,指定輸入數據所佔寬度 |
* | 星號,讀入後不賦予任何變量 |
hh | 同 h,但僅對C99有效 |
ll | 同 l,但僅對C99有效 |
這裏說下轉換字符:[...]和[ ^...]。
一. [...]使用 輸入數據爲0984abcZXC
#include <stdio.h> main() { char strings[100]; printf( "input strings:\n"); scanf( "%[1234567890] ",strings);//這裏用的是[1234567890] printf( "%s ",strings); } |
#include <stdio.h> main() { char strings[100]; printf( "input strings:\n"); scanf( "%[0-9] ",strings); //這裏用的是[0-9] printf( "%s ",strings); } |
輸出:0984 | 輸出:0984 |
通過運行可以發現它的作用是:如果輸入的字符屬於方括號內字符串中某個字符,那麼就提取該字符;如果一經發現不屬於就結束提取。該方法會自動加上一個字符串結束符到已經提取的字符後面。
scanf( "%[1234567890] ",strings)和scanf( "%[0-9] ",strings)是相同的,%[0-9]中的'-'是範圍連接符。
常表示的有[0-9] 表示匹配0到9中任意數字,%[a-z] 表示匹配a到z中任意字符,%[A-Z] 表示匹配A到Z中任意字符,也可以[0-9a-zA-Z],也可以[0-5]表達。
2.%[^...]使用
^表示"非",即讀入其後面的字符就結束讀入。
取到指定字符爲止的字符串。 如在下例中,取遇到空格爲止字符串。 |
給定一個字符串iios/12DDWDFF@122, 獲取 / 和 @ 之間的字符串,先將 "iios/"過濾掉,再將非'@'後的一串內容送到buf中 |
#include <stdio.h> main() { char strings[100]; printf( "input strings:\n"); scanf( "%[^ ]",strings); //輸入1aB 4tC printf( "%s ",strings); } |
#include <stdio.h> main() { char strings[100]; printf( "input strings:\n"); scanf( "%*[^/]/%[^@]",strings); //輸入iios/12DDWDFF@122 printf( "%s ",strings); } |
輸出:1aB | 輸出:12DDWDFF |
通過運行可以發現它的作用是:如果輸入的字符屬於方括號內字符串中某個字符(空格),那麼就停止提取該字符後的字符了。
在第二個實例scanf( "%*[^/]/%[^@]",strings); 中用到了“*”,在這裏也解說下"*"表示讀入後不賦予任何變量。也就是把前面講到的字符過濾掉。
“%*[^/]/”意思爲字符過濾到第一個"/"字符位置,前面的字符不顯示,[^/]表示清除第一個"/"前的字符緩衝數據。