Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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++ 在字符串c+中的某些字符后插入空格+;_C++_Insert - Fatal编程技术网

C++ 在字符串c+中的某些字符后插入空格+;

C++ 在字符串c+中的某些字符后插入空格+;,c++,insert,C++,Insert,我正在尝试以某种方式格式化字符串,以便以后可以标记它。如果迭代器指向字符串的第一个字符,并且它是一个运算符,那么我们只在它后面插入一个空格。如果它指向最后一个字符,并且是运算符,则只在它前面插入空格。否则,请在运算符前后插入空格。当它到达“N”时,它成功地在其前后插入空格,但一旦我增加指针,它就会显示这个非常奇怪的值,然后断开: Name Value i "þîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþV^º" input "( 2 &a

我正在尝试以某种方式格式化字符串,以便以后可以标记它。如果迭代器指向字符串的第一个字符,并且它是一个运算符,那么我们只在它后面插入一个空格。如果它指向最后一个字符,并且是运算符,则只在它前面插入空格。否则,请在运算符前后插入空格。当它到达“N”时,它成功地在其前后插入空格,但一旦我增加指针,它就会显示这个非常奇怪的值,然后断开:

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]...