與string類有關(guān)的cin&getline(cin,string)輸入輸出實例分析與反思
前言:
主要是寫代碼的時候有幾個不清楚的地方,一個一個試了一下,并用文字分析了下(腦袋有點暈,寫出來不容易出錯)。又截了圖,那就順便發(fā)出來了吧hhhh。
正文:
本文的行文邏輯就是分析代碼(using example),搞懂輸入和輸出是怎么對應(yīng)上的,最后給出防止問題產(chǎn)生的方法和知識點總結(jié)。
example1(本文用 ’*‘代替空格,便于辨認)

注意cin、getline的順序。
example2

code1和2只有cin和getline的順序變動了一下,結(jié)果也很好理解。(不解釋啦)
然后問題其實和下面的幾個代碼有關(guān)。
example3(和example的code一樣,但輸入不同)

是的沒錯,你敲完\n(也就是回車),程序就結(jié)束了。
!?。∫簿褪钦f先用cin再用getline會出現(xiàn)問題。
解釋:cin遇到空格或\n結(jié)束會語句,同樣的,getline遇到\n會結(jié)束語句。
流程:輸入12\n后,cin讀取12,cin讀取\n,cin停止(\n并沒有消失)。getline讀取\n,getline停止。
為了防止example3這種情況的出現(xiàn),我們需要加一行g(shù)etchar();具體見下文代碼。
example4

很正常吧?輸入完123回車,在輸入abc。輸出也很normal。
解釋:
輸入完123后,理所當然的想用回車來結(jié)束輸入,于是cin結(jié)束了(\n仍然存在),緊接著getchar讀取了\n(\n消失了?。缓骻etline并沒有看到\n于是讀取了abc。
example5(code3,輸入和example3的輸入類似)

可以和example3不見getchar的代碼進行對比,效果拔群!
不論怎么輸入都會得到想要的結(jié)果。
解釋:
當輸入完123后輸入空格時cin讀取到空格結(jié)束,同時空格本身不會消失,然后空格被getchar讀取,接著到getline讀?。ㄗx取了abc)。
什么?這些分析和改進有什么dia用?下面是我寫題涉及到的部分代碼,主要是紅框內(nèi)容。


拿下??!

結(jié)尾:
稍微總結(jié)一下
cin遇到空格或回車結(jié)束,會保留遇到的空格或回車
getline(cin,string)遇到回車停止。(人家叫g(shù)etline,讀取一行(line),很合理吧)
getchar()讀取一個字符(當然包括空格和\n了)
cin緊接著getline會出bug,兩者間需要添加getchar()。