在C ++中的某些位置向字符串添加空间

时间:2018-11-14 08:22:48

标签: c++ string substring

在C ++中,我很难弄清楚在大写字母的字符串中添加空格的过程。如果我有一个字符串“ HelloWorld”,如何将其转换为“ Hello World”?

我尝试使用子字符串和isupper函数,但是我什么都无法工作。

编辑:这是我的代码。我不明白为什么in = newname是无效的代码。

string breakStringAtCaps(string in) {
string newname[10];
    int j = 0;
    for (int i = 0; i < in.size(); i++) {
        if (isupper(in[i]) && i != 0) {
            newname[j] = " ";
            j++;
        }
        newname[j] = in[i];
        j++;

    }
    in = newname;
    return in;
}

4 个答案:

答案 0 :(得分:1)

您在思考substr时的想法是正确的,但是您的实现有些偏离。如果要创建一个包含原始内容的新字符串,并在每个大写字母(不包括首字母)之前插入一个' '(空格),则可以使用{ {1}},然后使用自动量程 substr(0,1)循环和for评估第一个字符之后的每个字符。

循环和检查substr(1)基本上就是您所需要的,例如

isupper()

(如果在命令行上未给定字符串作为参数,则默认情况下程序将使用#include <iostream> #include <string> #include <cctype> int main (int argc, char **argv) { std::string s = argc > 1 ? argv[1] : "HelloWorld", snew = s.substr (0,1); if (s.size() > 0) for (auto& c : s.substr(1)) { if (std::isupper (c)) snew += " "; snew += c; } std::cout << snew << '\n'; } ,否则将使用命令行上给定的字符串)

使用/输出示例

"HelloWorld"

或使用给出的字符串作为参数:

$ ./bin/spacebeforeupper
Hello World

答案 1 :(得分:0)

您可以遍历strin字符,检查是否为大写字母,并在其前插入' '

它应该像这样:

for(int i=0; i < str.length(); i++) 
{
    if (str[i]>='A' && str[i]<='Z') 
    {
        if (i != 0) 
            cout << " "; 
        cout << str[i]; 
    }
    else
    {
        cout << str[i];
    }
}

答案 2 :(得分:0)

您可以这样做:

string breakStringAtCaps(const string& in)
{
    string newname;
    for(int i = 0; i < in.size(); i++)
    {
        if(isupper(in[i]) && i != 0)
            newname += " ";
        newname += in[i];
    }
    return newname;
}

答案 3 :(得分:0)

我只是给出一个实现,也许不是最好的解决方案:

#include <string>
#include <ctype.h>
void breakStringAtCaps(std::string& in) {
    std::string::const_iterator it = in.begin();
    while(it != in.end()) {
      if(it != in.begin() && isupper(*it)) {
        in.insert(it, ' ');
        it += 2;
    }
    else
        ++it;
    }
}

//
#include <iostream>
int main(int argc, char** argv) {
    std::string str("HelloWorld;");
    breakStringAtCaps(str);
    std::cout << str.c_str() << std::endl;
    return 0;
}

以及您的代码中

string newname [10];

此处“ newname”是字符串数组的名称。您不应将数组名称分配给字符串实例。 而newname [i]表示数组的第i个字符串,而不是您想要的名为“ newname”的字符串的第i个字符。