我写了一个程序,它应该从字符串中删除多余的空格。但它只显示空格前的字符。它找到一个空格并在之后检查字符是否是空格。根据多余的空间,它会将其他角色转移到多余的空间。但输出非常混乱。
输入:“qwe(2个空格)rt(一个空格)y”
输出:“qwe(一个空格)rt(一个空格)y”
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
int main(){
string a;
cin >> a;
int len = a.length();
int new_len=len;
int z,s=0;
for(int i=0; i<new_len; i++){
if(a[i]==' '){
z=i+1;
s=0;
//Assigning the number of excess spaces to s.
while(a[z]==' '){
s++;
z++;
}
//doing the shifting here.
if(s>0){
for(int l=i+1; l<new_len-s; l++){
a[l]=a[s+l];
}
}
new_len-=s;
}
}
cout << a << endl;
cout << a.length();
system("pause");
return 0;
}
答案 0 :(得分:1)
您的代码非常无效。想象一下包含1,000,000个字符的以下字符串:
a a a a a a a...
每当你的算法遇到第二个空格时,它会遍历整个字符串,将其向左移动一个字符。我会尝试另一种方法:
string[realPos] != ' '
和charPos != realPos
,请进行分配:string[charPos] = string[realPos]
。然后将realPos
和charPos
加1。将spacesSeen设置为0。string[realPos] == ' '
和spacesSeen == 0
,请将spacesSeen
加1,复制字符并推进两个迭代器。 string[realPos] == ' '
和spacesSeen > 0
,则增加spacesSeen
,然后仅增加realPos
。简单来说:逐个复制字符并在途中跳过多个空格。
答案 1 :(得分:1)
您的大多数代码都是无意义的 - 当您使用普通字符串提取器(stream >> string
)时,它会自动跳过所有连续的前导空格,并停止在第一个空白字符处读取。因此,它几乎已经完成了其余代码要完成的所有事情。这留下了一种更简单的方法来完成相同的任务:
std::copy(std::istream_iterator<std::string>(std::cin),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(std::cout, " "));
这确实有一个问题:它会在输出的 end 处留下一个额外的空间。如果您不想这样,可以使用我之前发布的infix_ostream_iterator
。有了这个,你就可以将上面改为:
std::copy(std::istream_iterator<std::string>(std::cin),
std::istream_iterator<std::string>(),
infix_ostream_iterator<std::string>(std::cout, " "));
答案 2 :(得分:1)
如果你正在使用C ++ 11这样做你的方式是矫枉过正 - 你可以使用正则表达式。像下面这样的东西应该这样做(未经测试):
#include <regex>
#include <iostream>
#include <string>
using namespace::std;
int main(){
string a;
cin >> a;
regex r(" +");
a = regex_replace(a,r," ");
cout << a << endl;
cout << a.length();
system("pause");
return 0;
}