C++ 如何使用string::erase(它会添加垃圾)

C++ 如何使用string::erase(它会添加垃圾),c++,string,stl,C++,String,Stl,我希望有人能在这方面帮助我 我有一些代码,其中有一个字符串变量数据。数据总是包含这样的内容:“401454654。它总是一个后面有一个数字的字母。我想去掉前面的“门”。数据也可能是空字符串。我当前的解决方案如下所示: string data = /* ... */; if(!data.empty()) data.erase(data.begin()); else cout << "Error in line ...." << endl; 有趣的是,我总是

我希望有人能在这方面帮助我

我有一些代码,其中有一个字符串变量数据。数据总是包含这样的内容:“401454654。它总是一个后面有一个数字的字母。我想去掉前面的“门”。数据也可能是空字符串。我当前的解决方案如下所示:

string data = /* ... */;
if(!data.empty())
    data.erase(data.begin());
else
    cout << "Error in line ...." << endl;
有趣的是,我总是得到只有数字的正确字符串,或者一个空字符串。但有时我会看到一些奇怪的角色,再加上原来的401454654。我真的不知道,这是什么原因


在windows和linux上的g++4.6和g++4.9 linaro上测试。总是完全相同的结果。我希望有人能给我一个建议。

您可能会看到以下错误:

不过这很有趣,我能够在gcc 4.8.1中编译:

data.erase(data.begin());
如果是bug,您可以实现它在引擎盖下执行的代码:

copy(next(data.begin()), data.end(), data.begin());
data.pop_back();

对不起,我迟了答复。我自己解决了。我实际上不知道实现中的bug,我上传到gist上,但是我第二次实现了它,而且实现的方式要好得多。第一次我只有几分钟的时间来实现它。谢谢你的帮助。

你能给我们一个小的可编译的例子来演示这个问题吗?我将发布一些代码。它是一个csv到ldif的转换器。。什么输入会重现问题?您的输入数据是否可能在有用的数据后面包含奇怪的字符?代码的第33行似乎假设数据是干净的,但事实可能并非如此。