考虑以下非常简单的文本示例:
#include <stdio.h>
#include <string>
int main() {
std::string x("ugabuga");
int i=0;
while (x[i]) {
++i;
}
printf("%d\n",i); //should print 7
return 0;
}
我希望程序遍历字符串的所有字符,然后到达打破循环的空终止字符并正确到达程序结束。但是,当我尝试在 Visual Studio 2010 下以调试模式编译它时,我遇到了一个异常“字符串下标超出范围”。在发布模式下编译时,该程序通过,但我更大的项目取决于此行为崩溃 - 可能是因为这个问题。
但是,当我检查www.cplusplus.comstd::string::operator[]
的规范时,会显式处理结束字符串:
如果 pos 等于字符串长度,则函数返回对空字符 ('\0') 的引用。
我想在这里问:
- 我对规范的解释是否
std::string
正确?还是我错过了什么? - 如果问题出在实现的 VS 方面,我怎样才能轻松解决这个问题 - 希望
length()
每次我使用operator[]
? 例如,使用c_str()[i]
会安全吗? - 如果问题出在 VS 的实施方面 - 你知道它是否在 VS 2012 中得到修复,或者将来可能会得到修复?