字符串替换为%20的空白字符忽略所有尾随空格

时间:2014-12-22 05:08:16

标签: c++

我想用%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;
}

3 个答案:

答案 0 :(得分:2)

打开手册会显示string::append()只接受字符串作为输入,因此您可能需要:

new_String += string(url[j]);

作为旁注,您不需要现代C ++中的所有样板(appendat,整数循环)。

答案 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

实例:http://ideone.com/kXPKgU

要注意,SO上的此链接提供了 What's the best way to trim std::string? 的答案。

for_each是一个基本上是循环的算法函数。循环的每次迭代都会调用函数,函数对象或lambda(如果使用C ++ 11)。因为在这种情况下我们使用了一个名为Converter的函数对象,所以我们重载了operator()的{​​{1}}来构建我们的字符串。