羽夏閒談 C 的 scanf 的高階用法

2022-09-20 16:36:10 字數 2730 閱讀 8696

今天看到博友發了個有關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的返回值 ...