字符串中的擦除()space
erase() space in string
这是我编写的用于删除给定字符串中的 spaces 的代码。它通常有效。
string a = "hello there world";
int n = a.size();
for(int i =0 ;i<n;++i){
if(a[i] == ' '){
a.erase(a.begin()+i);
}
}
cout<<a;
但是对于上面给定的输入(请注意,在“hello”和“那里" ),我的输出是:
hello thereworld
"hello" 和 "world" 之间还有一个 space。
这种行为正常吗?这与 erase
有关吗?
不,但你的问题是你向前循环并忽略了你正在循环的字符串在你循环时发生变化的事实。
删除一个 space 后,字符串的其余部分向后移动一个位置,但您认为当前字符已被选中,即使您刚刚更改它。
所以您基本上不会检查紧跟在 space 之后的任何字符,因此为什么不删除连续的第二个 space。
如果您向后循环遍历字符串(或在删除space后手动递减i
),它会起作用。
另请注意,出于同样的原因,您事先将 a.size()
保存在变量 n
中是错误的,因为每次删除 space 时它都会更改。您应该在擦除 space 后递减 n
,或者在循环条件中检查 i < a.size()
而不是 i < n
。 (如果你向后循环,那就没问题了。)
所以最重要的是,解决这两个问题的最简单方法是向后循环而不是向前循环:
for (int i = n - 1; i >= 0; i--)
您在擦除第一个后超越了第二个 space,因为您立即增加了索引 i
。
例如,如果您修改循环以便在找到 space 的情况下不增加 i
而是减少 n
,它将正常工作,因为您删除的字符之后的下一个字符具有相同的索引,并且字符串短了一个。
这是我编写的用于删除给定字符串中的 spaces 的代码。它通常有效。
string a = "hello there world";
int n = a.size();
for(int i =0 ;i<n;++i){
if(a[i] == ' '){
a.erase(a.begin()+i);
}
}
cout<<a;
但是对于上面给定的输入(请注意,在“hello”和“那里" ),我的输出是:
hello thereworld
"hello" 和 "world" 之间还有一个 space。
这种行为正常吗?这与 erase
有关吗?
不,但你的问题是你向前循环并忽略了你正在循环的字符串在你循环时发生变化的事实。
删除一个 space 后,字符串的其余部分向后移动一个位置,但您认为当前字符已被选中,即使您刚刚更改它。
所以您基本上不会检查紧跟在 space 之后的任何字符,因此为什么不删除连续的第二个 space。
如果您向后循环遍历字符串(或在删除space后手动递减i
),它会起作用。
另请注意,出于同样的原因,您事先将 a.size()
保存在变量 n
中是错误的,因为每次删除 space 时它都会更改。您应该在擦除 space 后递减 n
,或者在循环条件中检查 i < a.size()
而不是 i < n
。 (如果你向后循环,那就没问题了。)
所以最重要的是,解决这两个问题的最简单方法是向后循环而不是向前循环:
for (int i = n - 1; i >= 0; i--)
您在擦除第一个后超越了第二个 space,因为您立即增加了索引 i
。
例如,如果您修改循环以便在找到 space 的情况下不增加 i
而是减少 n
,它将正常工作,因为您删除的字符之后的下一个字符具有相同的索引,并且字符串短了一个。