我尝试编写一个函数来获取带空格的字符串,并返回不带空格的字符串。
例如:
str = " a f ";
将被替换为“af”;
我的功能不起作用,它将字符串替换为:“af f”。
这是我的功能:
void remove_space(string& str) {
int len = str.length();
int j = 0, i = 0;
while (i < len) {
while (str.at(i) == ' ') i++;
str.at(j) = str.at(i);
i++;
j++;
}
}
int main ()
{
string str;
getline(cin, str);
remove_space(str);
cout << str << endl;
return 0;
}
任何帮助表示赞赏!
答案 0 :(得分:3)
您忘记检查内循环访问的边界:while (str.at(i) == ' ') i++;
。
我重写了代码:
void remove_space(string& str)
{
int len = str.length();
int j = 0;
for (int i = 0; i < len;)
{
if (str.at(i) == ' ')
{
i++;
continue;
}
str.at(j++) = str.at(i++);
}
str.resize(j);
}
此外,您可以使用以下代码删除空格(cppreference.com中建议):
str.erase(std::remove(str.begin(), str.end(), ' '), str.end());
答案 1 :(得分:2)
如果您可以使用Boost,则可以执行以下操作:
#include<boost/algorithm/string.hpp>
...
erase_all(str, " ");
否则,我会建议这个替代方案:
#include<cctype>
#include<algorithm>
...
str.erase(std::remove (str.begin(), str.end(), ' '), str.end());
答案 2 :(得分:1)
#include<cctype>
#include<algorithm>
bool my_isspace(char c) {
return std::isspace(c);
}
str.erase(remove_if(str.begin(), str.end(), my_isspace), str.end());
应该做的。
关于你的功能
void remove_spaces(string& str)
{
int len = str.length();
int j = 0, i = 0;
while (j < len)
{
if (str.at(i) == ' ') {
++j;
}
str.at(i) = str.at(j);
++i;
++j;
}
// You are missing this
str.erase(i,len);
}
答案 3 :(得分:1)
您可以使用久经考验的erase remove idiom:
,而不是实施自己的解决方案#include <string>
#include <algorithm>
#include <iostream>
int main()
{
std::string s("a b c d e f g");
std::cout << s << "\n";
const char_to_remove = ' ';
s.erase(std::remove(s.begin(), s.end(), char_to_remove), s.end() );
std::cout << s << "\n";
}
答案 4 :(得分:1)
您需要在处理后调整字符串大小。例如。在remove_space
末尾添加行:
str.resize(j);