首先,先來講一下scanf的讀取流程:
從鍵盤輸入的都是字符類型(一系列的字符),scanf()的作用就是將這個字符序列轉(zhuǎn)換成一個或多個指定的類型,并保存到變量中。
從鍵盤輸入的字符序列會先緩存到鍵盤緩沖區(qū)中,當用戶輸入回車,這時會清空鍵盤緩沖區(qū),將鍵盤緩沖區(qū)的數(shù)據(jù)(包括回車)送入到stdin中
這時scanf()開始從stdin中讀取數(shù)據(jù)。
scanf()在讀取每個字段時都會忽略空白符(%c比較特殊)。以%d為例,scanf()會先忽略stdin中的空白符,直到遇到第一個0-9開始讀取,如果后面的字符依然是0-9就繼續(xù)讀取,直到遇到空白符或者非0-9的字符,scanf認為%d的讀取完畢,將讀取的字符序列轉(zhuǎn)換成十進制整型保存到變量中。最后遇到的空白符或非法字符將返回到stdin中去。
如果忽略掉前面的空白符后第一個遇到的是非法的字符(非0-9),比如a,這時a會被返回到stdin中,程序也將會跳出scanf()函數(shù)(不管%d后面是否還存在帶輸入項,如另一個%d,都會跳出整個scanf()函數(shù))。
看一個例子:
延伸閱讀
學習是年輕人改變自己的最好方式