Re: [問題] string gets的用法

作者: soheadsome (師大狗鼻哥)   2014-07-19 23:33:25
※ 引述《ga544523 (美麗新世界)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: c++
: 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
: string
: iostream
: 問題(Question):
: 1.這是我打的一個用string的爛東東
: 自己在vc2010c++上執行時會出錯
: 但用線上編譯器ide執行時卻好像沒問題
: 請問這到底是?
: http://ideone.com/PL1Lx0
首先 std::string 實作品
沒有保證最後一個字元一定是'\0'(或是0)
我忘了是看c++那本書有提到 應該是effective c++
所以你這樣執行有可能是undefined behavier
: 2.
: 再來就是gets
: 我知道是一個可以讓你輸入包括空白字元的字串函數
: 但好像如果gets上面有像cin scanf之類的函數
: 他就會自動忽略gets
: 像這樣
: http://ideone.com/nMoXMX
: 自己是有找到解決辦法就是在gets上面+個getchar()
: 但為什麼這樣就可以還是搞不懂
: 希望有人可以幫我解答
: 感恩喔
這問題看不是很懂
你是要說gets沒被執行到的原因嗎?
應該又是跟緩衝區有關的事情
我學c/c++到現在還是很難理解緩衝區的運作
你可以試著在每次cin後先fflush()看看
作者: damody (天亮damody)   2014-07-20 01:11:00
第一點講錯了中括號取不到而已
作者: LPH66 (-6.2598534e+18f)   2014-07-20 09:22:00
不要混用 C++ 的 cin/cout 跟 C 的 FILE 系列函式也不要對 stdin 做 fflush..這邊的正解是你得想辦法吃掉換行做法可以是再用一個 gets 吃掉它 (也就是寫兩次, 第二次才是真正的讀取資料)如果不得已要混用 C++ 的 cin/cout 及 C 的 stdin/stdout請先執行 cout.sync_with_stdio();
作者: soheadsome (師大狗鼻哥)   2014-07-20 09:32:00
第一點不對嗎 中括號取不到 應該代表沒保證嗎?我晚點再去翻出這篇章好了
作者: scwg ( )   2014-07-20 10:50:00
C++98 和 11 都允許 s[s.size()] 並回傳 (reference to) '\0'原 po 看到的應該是說 s[i] == '\0' 「沒有保證是最後一個字元」
作者: Caesar08 (Caesar)   2014-07-20 14:51:00
http://ppt.cc/ggUJ 看起來是11之後才有保證
作者: scwg ( )   2014-07-21 00:10:00
huh, cppreference.com 比 cplusplus.com 更接近標準要 c++98 compliance 要寫 const_cast<const string&>(a)[i]

Links booklink

Contact Us: admin [ a t ] ucptt.com