1 回答

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
scanf 的第一個(gè)參數(shù)叫“格式化字符串”,必須按照這個(gè)格式來(lái)輸入,scanf 才能正確地把輸入的內(nèi)容存到后面的變量中去。
你代碼中 scanf 的格式化字符串指定的格式是"%d%d",這要求輸入兩個(gè)整型數(shù)值。
當(dāng)然輸入時(shí)必須用某種方式將兩個(gè)數(shù)值分隔開(kāi),這樣 scanf 才能知道你輸入了兩個(gè)內(nèi)容——比如你想輸入 12 和 34 兩個(gè)數(shù),如果你直接輸入 1234,scanf 無(wú)從知道這到底算是輸入了幾個(gè)數(shù)。默認(rèn)情況下,能在輸入中起到分割作用的字符就是所謂的“空白字符”,即 回車(chē)、空格、tab 等。
所以你應(yīng)該輸入“7 空格 9”“7 回車(chē) 9”“7 tab 9”這樣的才算正確。
逗號(hào)只是個(gè)普通字符,你輸入的“7,9”與你的格式化字符串并不匹配,scanf 無(wú)法正確地識(shí)別你的輸入,結(jié)果當(dāng)然就錯(cuò)了。
反之,如果你在 scanf 中格式化字符串寫(xiě)的是 "%d,%d",那你就只能輸入“7,9”了。輸入“7 空格 9”什么的反而是錯(cuò)的了。
前面說(shuō)如果實(shí)際輸入內(nèi)容中有的地方與 scanf 中格式化字符串不匹配,那么 scanf 就會(huì)中途識(shí)別失敗,直接結(jié)束 scanf 的工作,繼續(xù)執(zhí)行后面的代碼。
你的例子中由于錯(cuò)誤地輸入了逗號(hào),導(dǎo)致 b 并未成功寫(xiě)入值。 看起來(lái) b 之前也沒(méi)有被適當(dāng)初始化,所以 b 的值會(huì)是隨機(jī)值,最后的結(jié)果也就不正確了。
如果繼續(xù)擴(kuò)展思考一下的話,你會(huì)覺(jué)得 scanf 中途識(shí)別失敗竟然就若無(wú)其事地結(jié)束了工作——不管是不是成功地接收了所有的輸入! 這樣不就無(wú)法知道在運(yùn)行時(shí)用戶(hù)有沒(méi)有正確輸入了嗎?
其實(shí)是有辦法的(scanf 不是那么不負(fù)責(zé)的)。scanf 是有返回值的,它在執(zhí)行后會(huì)返回“在識(shí)別時(shí)正確接收了的參數(shù)的個(gè)數(shù)”,程序員通過(guò)這個(gè)來(lái)判斷是否正確識(shí)別了用戶(hù)輸入的所有內(nèi)容、成功轉(zhuǎn)換接收了全部變量。
你這里 scanf 返回 2 才證明 scanf 成功從你的輸入中讀取并存入了 a 和 b 兩個(gè)變量中。
- 1 回答
- 0 關(guān)注
- 752 瀏覽
添加回答
舉報(bào)