最近由于要參加老師要求參加的中海油舉辦的pi-Frame軟件編程比賽,準備復習一下C++,結果在使用cin.getline()
接受輸入時發現得到的string
長度有問題,導致比較的時候不能得到預期結果。。。
打字機
經過一番糾結,結果發現原來還是end of line問題。如果看過老式打印機就會知道,打字的時候想要換行要進行兩個操作,一個是LF(line feed),就是擰旋鈕把紙張向上移動一行;另一個是CR(carriage return),就是板一下把手把打字的那個頭移動到一行的最前面。在ASCII碼中,LF對應著10,而CR對應著13,一般用字符表示成'\n'
和'\r'
。
Dex | Char | str |
---|---|---|
10 | LF | '\n' |
13 | CR | '\r' |
由于歷史原因,不同系統在處理字符行結尾的時候會加不同的字符。
Windows | Unix-like | Old Mac(pre-OSX) |
---|---|---|
'\n\r' | '\n' | '\r' |
因此,文本文件在不同系統下創建和使用時就會出現不兼容的問題。
我的問題是,我在Windows上使用Cygwin,將gcc作為編譯器,在輸入字符時,接受的字符串是以'\n\r'
結尾的,而getline()
則以'\n'
結尾的方式對其進行處理。
解決的辦法是在getline()
中特別指定結束符,getline(cin, text, '\r')
,可是這么寫的代碼在別的情形下貌似會出問題。期待有更加完美的解決方法。