close

C++ scanf的進偕用法 

以下提幾個 scanf 較少見的技巧,確實不難,下面直接舉例說明。

0. 指定長度 %5s

配對時,最多只收長度為 5 之字串

char s[2000],g[200];
scanf("%5s%s", s, g);
printf("s=%s, g=%s\n", s, g);

1234567890
s=12345, g=67890

 

1. 指定字元配對 %[abz;]

配對時,只收 abz; 這四個字元

char s[2000],g[200];
scanf("%[abz;]%s", s, g);
printf("s=%s, g=%s\n", s, g);

az;abb;ABcdef123
s=az;abb;, g=ABcdef123

 

2. 指定字元配對 %[a-z ]

注意到,a-z 後面還有一個空白。配對時,只收 a-z 及空白鍵

char s[2000],g[200];
scanf("%[a-z ]%s", s, g);
printf("s=%s, g=%s\n", s, g);

abc xyz 123
s=abc xyz , g=123

 

3. 指定字元配對 %[a-zA-Z0-9]

配對 a~z, A~Z, 0~9

char s[2000],g[200];
scanf("%[a-zA-Z0-9]%s", s, g);
printf("s=%s, g=%s\n", s, g);

adzBWR0a8;das
s=adzBWR0a8, g=;das

 

4. 指定斷點字元 %[^,]

^ 即為斷點的意思,%[^,] 即為讀到 , 之前 (不含 ,) 之字串

char s[2000],g[200];
scanf("%[^,]%s", s, g);
printf("s=%s, g=%s\n", s, g);

ab,cd
s=ab, g=,cd

相似的,也有 %[^a-z]

 

5. 符號中間之文字 %[^@]@%[^.]

取得 @~. 之間之文字,不含 @ 與 .

char s[2000],g[200];
scanf("%*[^@]@%[^.]%s", s, g);
printf("s=%s, g=%s\n", s, g);

edisonx@pixnet.net.tw
s=pixnet, g=.net.tw

 

基本上,用上面的 [] 與 [^] 可做的事非常多,多練習應可達到不錯效果。

以上文章轉載於http://edisonx.pixnet.net/blog/post/74516127-%5Bc%26%2B%2B%5D-scanf-%E9%80%B2%E9%9A%8E%E7%94%A8%E6%B3%95

==========================================================================

vs2013 要使用scanf的方法

如果正常要使用scanf 會發生錯誤Compile error 或者出現以下訊息

error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\users\user\documents\visual studio 2013\projects\test\test.cpp 8 1 Test

解決

方法1. 

加入

#define _CRT_SECURE_NO_WARNINGS   
若不小心沒注意到資料量造成記憶體錯誤,可能在Linux就吐給你Segment Fault了
 

方法2.

用warning parama去關閉該warning
#pragma warning( disable : 4996 )
若不小心沒注意到資料量造成記憶體錯誤,可能在Linux就吐給你Segment Fault了
 

方法3.

c++文章用  c++文章用  

若不小心沒注意到資料量造成記憶體錯誤,可能在Linux就吐給你Segment Fault了

方法4:

scanf_s("%s",str,SIZE)

scanf_s多了第三個參數是放置該陣列大小,以免溢出較scanf安全但sscanf_s等等增強安全性函式只有在Windows底下才支援

 

所以建議在撰寫時為了保持可移植性,還是遵照標準ISO

 

方法4:

直接透過編譯器在編譯時期用更安全的函式版本代換(也就是你寫scanf,其實在編譯時自己幫你換成scanf_s),則在程式碼前方

#define_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1

也可參考http://danny50610.blogspot.tw/2014/11/visual-studio-community-2013-scanf.html 這網站有詳細的圖示

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 vipwealthy 的頭像
    vipwealthy

    vipwealthy的部落格

    wealthy 發表在 痞客邦 留言(0) 人氣()