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