C++ 在字符串c+中的某些字符后插入空格+;
我正在尝试以某种方式格式化字符串,以便以后可以标记它。如果迭代器指向字符串的第一个字符,并且它是一个运算符,那么我们只在它后面插入一个空格。如果它指向最后一个字符,并且是运算符,则只在它前面插入空格。否则,请在运算符前后插入空格。当它到达“N”时,它成功地在其前后插入空格,但一旦我增加指针,它就会显示这个非常奇怪的值,然后断开:C++ 在字符串c+中的某些字符后插入空格+;,c++,insert,C++,Insert,我正在尝试以某种方式格式化字符串,以便以后可以标记它。如果迭代器指向字符串的第一个字符,并且它是一个运算符,那么我们只在它后面插入一个空格。如果它指向最后一个字符,并且是运算符,则只在它前面插入空格。否则,请在运算符前后插入空格。当它到达“N”时,它成功地在其前后插入空格,但一旦我增加指针,它就会显示这个非常奇怪的值,然后断开: Name Value i "þîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþV^º" input "( 2 &a
Name Value
i "þîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþV^º"
input "( 2 & 2 | 2 G 2 & 2 N 2|2L2&2=2)"
这是我的密码:
input = "(2&2|2G2&2N2|2L2&2=2)";
// this is how (2&&2||2>=2&&2!=2||2<=2&&2==2) would be stored into the string
string::iterator i = input.begin();
while(i != input.end())
{
if(isOperator(*i) && i == input.begin())
{
input.insert(i+1, ' ');
i+=2;
}
else if(isOperator(*i) && i == input.end()-1)
{
input.insert(i, ' ');
i+=2;
}
else if(isOperator(*i))
{
input.insert(i, ' ');
input.insert(i+2, ' ');
i+=3;
}
else
{
i++;
}
}
input=“(2&2 | 2G2&2N2 | 2L2&2=2)”;
//这就是(2和2和2×>=2和2=2×2)P >您有未定义的行为。C++的字符串迭代器(按C++标准)由于insert
调用而无效,该调用将修改字符串内容,可能还修改内部字符串缓冲区的内存位置。问题是,您在字符串中的插入使迭代器无效。如果字符串大小调整-将数据内容移到内存中的其他位置-您一直试图访问旧的缓冲区?(提示:在封面下,迭代器可能是一个char*
)
如果您将代码更改为使用索引(即std::string::size\u type
)和运算符[]
,则无论在哪里分配,它都将跟随字符串
谢谢你的回答!你能详细说明一下吗?我是编程新手,对很多东西都不熟悉
好的。对于一个字符串,迭代器就像一个指针一样工作——记住存储字符串中特定字符的内存地址。因此,在设置迭代器开始后,您有如下内容
[std::string object x-]---------------->[text buffer ]
^
|
[iterator y-]------------------+
…其中“x”和“y”是保存地址的专用/隐藏指针,-->和^箭头显示指针指向的位置…最初是存储文本的缓冲区
使用std::string
,当您将新文本插入string
时,它会填满当前的缓冲区,然后自动在另一个地址获取更大的内存,复制数据,释放原始缓冲区,然后在x
中记录新缓冲区的地址。如果发生这种情况,则string
对象不更新迭代器(“y
”),因此情况如下:
--->[bigger text buffer ]
/
[std::string object x-]------------+ [!released memory!]
^
|
[iterator y-]------------------+
在此阶段,如果您取消对迭代器的引用以尝试查看它所寻址的字符,则表示您有未定义的行为。如果您将迭代器与字符串的end()
,它可能永远不会匹配,导致您在崩溃之前循环。如果程序的任何其他部分请求内存(包括另一个线程),它可能会得到释放的内存,并在以前的文本上写下新的内容。基本上,一切都会变得一团糟
与此相反,每当你说例如my_string[10]
时,它都会查看my_string
的当前缓冲区,包括可能由早期的insert
s引起的缓冲区移动。因此,使用数字[0..my_string.size()
)沿着字符串移动要安全得多,如:
for(std::string::size_type i=0;i
希望这有助于澄清问题。看起来像@POW:这很好……如果人们不询问他们的解决方案有什么问题,而只是要求我们提供我们自己的解决方案,解决方案的范围和实践“为什么不做X?”见解会减少。谢谢你的回答!你能详细说明一下吗?我对编程不熟悉,对很多事情都不熟悉。添加了一些解释。如果你想了解指针的一般背景,请点击我的个人资料-我的前3或4个答案之一是对指针的温和介绍/解释。
for (std::string::size_type i = 0; i < my_string.size(); ++i)
...do things with my_string[i]...