#include
intmain
(void);
scanf
("%[0-9]"
,a);
printf
("%s\n"
,a);
return0;
}上面的**什麼意思呢?試一下幾個輸入輸出:
示例0:輸入:13579
輸出:13579
示例1:輸入:121abc
輸出:121
示例2:輸入:shouwang123nb455
輸出:注意:這裡輸出不是123,如果想要輸出123怎麼辦?
請看後面丟棄特定字元部分。看到這裡,估計你已經看清套路了,沒錯,[0-9]表示scanf只讀取0-9的字元,而如果遇到不在該範圍內的字元,則停止,不再繼續讀取,就是前面我們看到的示例情況了。scanf的[scanf函式中,有乙個不常被人注意的,就是[了。它用來掃瞄特定的字符集。如果它以^開頭,表示掃瞄除了字符集以外的所有字元,否則就是前面我們看到的,只掃瞄讀取指定字元。scanf讀取空字元我們都知道,scanf在讀取內容的時候,會跳過空字元,比如:
char s[128] = ;
scanf("%s",s);
printf("%s\n",s);
假設輸入為: bianchengzhuji
那麼輸出將會是:bianchengzhuji
注意,前面的空字元並沒有讀入到字串s中,而是被跳過了。那如果要讀取空字元怎麼辦?很簡單:scanf("%[^\n]",s);
這裡的意思就是說,除了換行符,其他字元都讀入,也就是說前面的空字元也會被讀取,就達到了我們的目的了。忽略開頭的換行符如果我們一開始就按回車,你會發現,s什麼都沒有讀入,如何忽略開始的換行呢?像下面這樣就可以了:
#include
intmain
(void);
scanf
("%*[\n]%[^\n]"
,a);
printf
("%s\n"
,a);
}輸入輸出示例:輸入:[回車][回車]abc
輸出:abc
輸入時,按下兩次回車,再輸入其他字元,則最終會讀取其他字元,而忽略開頭的回車換行。我們知道,在scanf中,*是跳過相應的字元項,比如,跳過開頭的兩個數字:
#include
intmain
(void
)#include
intmain
(void);
scanf
("%*[a-za-z]%[0-9]"
,a);
printf
("%s\n"
,a);
return0;
}這樣,開頭的字母就會被丟棄。讀取指定長度的任意字元char s[8] = ;
scanf("%7s",s);
輸入:abcdefghij
輸出:abcdefg
這樣可以避免緩衝區溢位。總結scanf是我們剛開始學習c就會接觸的函式,除了基本的用法,今天的用法你是否曾經見過呢?scanf讀取內容會跳過開頭的空白字元,遇到換行符或者不是目標字元時結束讀取。當然,你不是沒有辦法,今天所分享的就是辦法。當然了,很多時候,你可能會選擇使用fgets,getchar之類的函式,無妨。問題
#include
intmain
(void
)輸入:abcd1234
輸出會是什麼?為什麼?
scanf 函式的說明
scanf的返回值由後面的引數決定,且返回值為int型 返回值表示成功讀入的資料的個數,如 scanf d d a,b 如果a和b都被成功讀入,那麼scanf的返回值就是2 如果只有a被成功讀入,返回值為1 如果a和b都未被成功讀入,返回值為0 如果遇到錯誤或遇到end of file,返回值為eo...
Scanf的輸入型別
scanf的輸入型別 1.格式字元與printf函式中的使用方式相同,以 d o x c s f e,無 u格式 g格式。2.可以指定輸入資料所佔列寬,系統自動按它擷取所需資料。3.後的 附加說明符,用來表示跳過它相應的資料。4.輸入資料時不能規定精度。5.根據格式字元的含義從輸入流中取得資料,當輸...
關於scanf的疑問
scanf函式是從標準輸入流 stdin 讀取資料,按照格式說明引數,將資料寫入引數位址所在空間,標準輸入流預設的是鍵盤輸入流,但是,由於作業系統的緩衝區管理機制,從鍵盤上輸入的資料不是直接被scanf函式讀取的,而是暫存在記憶體緩衝區,只有遇到回車鍵的時候,scanf函式才會開始工作,並且,最後輸...