Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::string::erase从字符串中删除起始字符_C++_String_Stl - Fatal编程技术网

C++ 使用std::string::erase从字符串中删除起始字符

C++ 使用std::string::erase从字符串中删除起始字符,c++,string,stl,C++,String,Stl,我试图截断字符串的起始零,所以我使用了序列擦除函数 字符串和擦除(大小\u t pos=0,大小\u t len=npos) 这是我的实现: string str="000010557"; for(char c:str){ cout<<c<<" "<<str<<" "<<"\n";// for debug purpose if(c=='0')

我试图截断字符串的起始零,所以我使用了序列擦除函数

字符串和擦除(大小\u t pos=0,大小\u t len=npos)

这是我的实现:

    string str="000010557";
            for(char c:str){
            cout<<c<<" "<<str<<" "<<"\n";// for debug purpose
            if(c=='0')
                str.erase(0,1);
            else
                break;

        }
        cout<<str;
我阅读了的文档,并在文章中思考可能存在一些迭代器无效,但是实现公认答案中推荐的代码片段也给出了相同的输出,请帮助我理解问题出在哪里


我不熟悉使用stl库函数,因此请原谅我的任何疏忽,谢谢。

您的
for
循环正在增加提取
c
的位置,即使您删除前导零。因此,在循环运行两次之后,您已经擦除了第一个和第三个前导零,那么
c
值将是第一个
1

以下是代码中发生的情况:

第一个循环的开始:
"000010557"
^
c为“0”,因此调用erase,使字符串:
"00010557"
在第一个循环结束时,位置将增加,因此。。。
第二个循环的开始:
"00010557"
^(请注意,我们跳过了零!)
c为“0”,因此调用erase,使字符串:
"0010557"
循环结束,位置增加,我们跳过另一个零,所以。。。
第三个循环的开始:
"0010557"
^
c不是“0”,所以我们打破了循环。
相反,您应该使用
while
循环,只测试第一个字符:

intmain()
{
字符串str=“000010557”;
字符c;
而((c=str.at(0))=“0”){

cout即使您让这段代码正常工作,这也不是一个好的解决方案。从字符串前面删除一个字符意味着将所有后续字符下移一个位置,并且代码会对每个前导零执行此操作。相反,计算前导零并一次将其全部删除:

std::string::size_type non_zero_pos = 0;
while (non_zero_pos < str.size() && str[non_zero_pos] == '0')
    ++non_zero_pos;
str.erase(0, non_zero_pos);

编辑:修复了对非0迭代器的搜索。

好的,这是我所理解的,这个for循环的行为类似于位置增量,而不是字符增量(我在实现过程中的想法),删除字符c后,位置会增加,但该位置的增量会导致字符增量大于1。我的方法正确吗?是否有一种方法可以在删除的同时迭代字符串,例如,如果我需要在随机位置进行删除,但仍要向前移动以进一步删除。
0 000010557
0 00010557
0 0010557
0 010557
10557
std::string::size_type non_zero_pos = 0;
while (non_zero_pos < str.size() && str[non_zero_pos] == '0')
    ++non_zero_pos;
str.erase(0, non_zero_pos);
auto non_zero_it = std::find_first_not_of(std::begin(str), std::end(str), "0");
str.erase(std::begin(str), non_zero_it);