我想用%20填充空格。下面的代码没有编译,并在行
给出错误new_String.append(url.at(j));`
代码:
void main()
{
string url = "abcde";
string new_String;
for (int j = 0; j < url.length(); ++j)
{
if (url.at(j) == ' ')
{
new_String.append("%20");
}
else
new_String.append(url.at(j));
}
根据Stackoverflow用户提供的建议,我可以执行我的程序。下面的代码工作正常。但是代码很复杂(尤其是尾随空格的计算)。任何人都可以给我一些建议,使代码更可行。该程序接受输入字符串并用%20
替换空白字符,但end
中的空白字符应忽略,不应由%20
替换。
#include"iostream"
using namespace std;
#include"string"
void main()
{
string url = "ta nuj ";
int count = 1; // it holds the blank space present in the end
for (int i = 0; i < url.length(); i++) // this is written to caculate the blank space that //are at the end
{
if (url.at(i) == ' ')
{
for (int k = i + 1; k < url.length(); k++)
{
if ((int)url.at(k) != 32)
{
count = 1;
break;
}
else
{
count++;
i++;
}
}
}
}
string newUrl;
for (int j = 0; j < url.length()-count; j++)
{
if (url.at(j) == ' ')
{
newUrl.append("%20");
}
else
newUrl += (url[j]);
}
cout << "\nThe replaced url is:" << newUrl;
}
答案 0 :(得分:2)
打开手册会显示string::append()
只接受字符串作为输入,因此您可能需要:
new_String += string(url[j]);
作为旁注,您不需要现代C ++中的所有样板(append
,at
,整数循环)。
答案 1 :(得分:0)
你有没有尝试过:
newUrl.append(1, url.at(j));
答案 2 :(得分:0)
有人可以给我一些建议让代码更可行吗?
如果这是问题,那么答案是使用算法函数来轻松完成。
首先,你应该修剪尾随空格的字符串。其次,通过遍历原始字符串来构建新字符串,在循环时测试空格字符。
以下说明了这两个概念:
#include <algorithm>
#include <string>
#include <iostream>
#include <cctype>
#include <functional>
using namespace std;
// A function object that will take a character, and append either "%20" or the
// original character to our new string
struct Converter
{
std::string* pS; // this points to our string we will build
Converter(std::string* s) : pS(s) {}
void operator()(char ch)
{
if ( isspace(ch) )
(*pS) += "%20"; // it's a space, so replace
else
*pS += ch; // it is not a space, so use the same character
}
};
// trim spaces from end of string
std::string &rtrim(std::string &s)
{
s.erase(std::find_if(s.rbegin(), s.rend(),
std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
return s;
}
// function to return the new string by looping over the original string
string getNewString(const std::string& s)
{
std::string outStr; // our new string
// loop over each character, calling our Coverter::operator()(char) function
for_each(s.begin(), s.end(), Converter(&outStr));
return outStr;
}
int main()
{
string instring = "This string has spaces ";
cout << getNewString(rtrim(instring));
}
输出:
This%20string%20has%20spaces
要注意,SO上的此链接提供了 What's the best way to trim std::string? 的答案。
for_each
是一个基本上是循环的算法函数。循环的每次迭代都会调用函数,函数对象或lambda(如果使用C ++ 11)。因为在这种情况下我们使用了一个名为Converter
的函数对象,所以我们重载了operator()
的{{1}}来构建我们的字符串。