scanf("%d,%d,"&a,&b) 如果輸入不加逗號 結果為什麼會這樣?

為什麼輸出a=1 b=0 c=16 d=4201520

(輸入沒加逗號)


以下,從 MSDN 中節選:

[1] Characters outside format specifications are expected to match the sequence of
characters in the input stream;

就是說,你寫的"%d,%d,%d,%d" 中的逗號,被期待在你的輸入中出現。

[2] the matching characters in the input stream are
scanned but not stored.

就是說,你寫的逗號僅僅會被掃描(不會被存儲到某個 field 之中)。

[3] If a character in the input stream conflicts with the
format specification, scanf terminates, and the character is left in the
input stream as if it had not been read.

重點是,你的輸入 "1 2 3 4 ...",和你寫的指定格式 「%d,%d,%d,%d" 首次發生衝突時,scanf 就會終止。其餘字元停留在輸入緩衝區中。

因此,你寫的代碼,在掃描到空格時, a 會被賦值。然後 scanf 因為需要掃描到一個逗號,但是輸入流緩衝區中當前位置不是逗號,於是 scanf 就結束了。後面的 b,c,d 沒有被賦值。


bcd都匹配失敗了,沒有改變,

又因為沒有初始化,所以是隨機數,


你先把a,b,c,d初始化為0,然後再看看結果就明白了


遇到這種情況,我一般都是這麼寫:

scanf(「%d%*c%d%*c%d%*c%d%*c」,a,b,c,d);

這個語句是我在知乎這兒直接寫的,不保證沒有中英文格式的問題啊~

%*c的作用是作為一個萬能輸入間隔符,當你輸入a以後,不論是輸入 空格,或者逗號,或者回車,這三種操作都會被%*c接收,然後你就可以接著輸入b的值啦~~~

那個..聽明白了么。。。?



輸入的時候每個值之前用逗號分開,盡量格式和scanf裡面的一樣,至於為什麼會這樣,才學C並不太會


scanf函數裡面的符號,在輸入的時候,一定要和它一致,即使你輸入了中文的逗號,在輸入的時候也要中文的


我的理解,scanf裡面你輸入了逗號或空格,鍵盤輸入也得輸入逗號空格,不知道這樣理解有沒有錯。


Scanf%前面有符號的話是要在輸入時在打一遍這個符號,你應該輸入1,2,3,4


實際上 ,scanf是從頭文件中調用的函數 是函數的話 那它的形參表列就會有其固定的形式。 當你輸入的形式與規定不符時,就無法完成正常的初始化 賦值 ,這時系統會隨機分配存儲空間,因此,輸出的時候就會出現錯誤。以上,是剛學完c的小白的理解。


默默地看了下標籤~#(捂臉)


推薦閱讀:

什麼樣的遊戲才能稱之為優化好?
初代Playstation繪製模型的原理是怎樣的?

TAG:計算機 | C編程語言 | CC | C語言設計習題 | C語言入門 |