今天看到博友發了個有關scanf
的使用的注意事項,就是討論緩衝區殘存資料的問題,用簡單的**示例複述一下:
#define _crt_secure_no_warnings
#include #include int main(int argc, char *ar**)
你或許碰到這個輸出:
5
a = 5 , b = 10
請按任意鍵繼續. . .
我明明想輸入個5,然後回車輸入下乙個字元,但是,回車符也是個字元,會被scanf
進去,絕大多數人的解決方案就是提前把這個字元讀取走,但是如果緩衝區的東西太多的話,需要加個迴圈,才能處理,下面我來介紹scanf
的高階用法,之間研究過,忘記在**看到的,這個是我總結的,那些基礎用法自己看看書就行了。
我先把清空緩衝區的**放上,因為後面的**都會用到,至於為什麼後面會有詳細介紹:
scanf("%*[^\n]"); //清除到回車符的所有字元
scanf("%*c"); //清除回車符
我們都知道scanf
可以指定小數字數和長度,如下是**示例:
#define _crt_secure_no_warnings
#include #include int main(int argc, char *ar**)
scanf("%5f", &f);
//清空緩衝區**
scanf("%5s", str1);
puts("執行後:");
printf("n=%d, f=%g, str=%s\n", n, f, str1);
system("pause");
return 0;
}
如下是輸入和輸出結果:
5653 12
2.56458452 2356.9999
helloworld
執行後:
n=56, f=2.564, str=hello
請按任意鍵繼續. . .
看到沒,清空緩衝區的**有效果了,如果沒有這行清空緩衝區的**,就會成這樣子:
5653 12
執行後:
n=56, f=53, str=12
請按任意鍵繼續. . .
這就是清除緩衝區的作用。
不要驚訝,scanf
也是支援類似正規表示式的功能的,我們用如下**進行演示:
#define _crt_secure_no_warnings
#include #include int main(int argc, char *ar**)
如下是輸入和輸出結果:
babccbaxyz
執行後:
babccba
請按任意鍵繼續. . .
**中的注釋可能說的不明白,這裡我長篇大論一下:字串從開頭開始匹配,必須字串只有abcd
中這四個字元任意乙個才有效,如果開頭沒有這四個字元,則匹配為空。
既然支援單範圍了,肯定也支援多範圍,什麼是多範圍匹配可以先看看一些基礎示例,如果會正規表示式的話很容易懂:
如果經常使用的話也就這些型別,如下是**示例:
#define _crt_secure_no_warnings
#include #include int main(int argc, char *ar**)
如下是輸入和輸出結果:
abcxyz123abcxyz123
執行後:
abcxyz
請按任意鍵繼續. . .
既然有匹配的字元,肯定有不想匹配的字元。對於不匹配某些字元,scanf
允許我們在%[ ]
中直接指定某些不能匹配的字元,具體方法就是在不匹配的字元前面加上^
,給幾個例子:
如下是**示例:
#define _crt_secure_no_warnings
#include #include int main(int argc, char *ar**)
如下是輸入和輸出結果:
abcxyz@#87edf
cnblog wingsummer
執行後:
str1=abcxyz@#
str2=cnblog wingsummer
請按任意鍵繼續. . .
scanf
還允許把讀取到的資料直接丟棄,不往變數中存放,具體方法就是在%
後面加乙個*
,如下是**示例:
#define _crt_secure_no_warnings
#include #include int main(int argc, char *ar**)
如下是輸入和輸出結果:
100 999abcxyzabcxyz
執行後:
n=999, str=abcxyz
請按任意鍵繼續. . .
Scanf系列函式的高階用法
scanf系列函式的高階用法 scanf 從乙個字串中讀進指定格式相符的資料,主要是用於從給定緩衝區內容輸入到變數,達到給變數賦值的目的。就是所謂的格式化輸入。在一般情況下,我們在使用scanf時都只使用了其簡單的用法。比如 int a 0 int b 0 scanf d d a,b 若這段 在控制...
c語言 輸入 用scanf 實現 gets的效果
scanf 2d n 讀取最大2位整數,後面的截斷 scanf 10s str 讀取最大10位字元scanf n scanf c 使緩衝區溢位,清空 fflush stdin 重新整理緩衝區 不是很通用匹配特定字元scanf abcd 只讀取字元abcd,順序不固定,遇到其他字元結束 a z 讀取a...
C語言scanf的探索
第一次寫帶的,貼上上去的,之後就沒了。我也是醉了。int i,sum 0 char ch printf 輸入多個整數以空格隔開 while scanf d i 0 printf 求和的結果為 d n sum return 0 若是有錯誤的地方請指點。1.下面是我探索的 主要是看看scanf的返回值 ...