【问题标题】:Adding Space to String at certain places in C++在 C++ 中的某些位置向字符串添加空格
【发布时间】:2018-11-14 08:22:47
【问题描述】:

我无法弄清楚在 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;
}

【问题讨论】:

  • 请出示您的代码。例如,如果您谈论的是 const char* 字符串文字(如“HelloWorld”)或 std::string,那么这会有所不同。
  • @WernerHenze(先生,你是个读心术师!)

标签: c++ string substring


【解决方案1】:

你可以这样做:

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;
}

【讨论】:

  • 谢谢,这是我一直在寻找的方法。只是在我不需要时将字符串分配为数组
【解决方案2】:

您的想法是正确的 substr,但您的实现有点偏离。如果创建一个包含原始内容的新字符串并在每个大写字母(不包括第一个)之前插入一个' '(空格),则可以使用substr(0,1) 为新字符串的第一个字符添加种子然后使用 auto ranged 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

或者用一个字符串作为参数:

$ ./bin/spacebeforeupper MyDogHasFleas
My Dog Has Fleas

【讨论】:

  • 美观紧凑。是否需要检查if (s.size() &gt; 0)
  • 理论上你可以传递一个空字符串,并且 nul-terminator 的第一个副本将被正确处理,但之后当你调用 s.substr(1) 访问超出字符串末尾的值,因此在考虑空字符串情况时,添加检查是有意义的。
【解决方案3】:

您可以遍历字符串字符,检查它是否是大写,如果是一个则在前面插入一个' '

应该是这样的:

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];
    }
}

【讨论】:

    【解决方案4】:

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

    #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;
    }
    

    在您的代码中,

    字符串新名称[10];

    这里的'newname'是一个字符串数组的名字。您不应该将数组的名称分配给字符串实例。 newname[i] 表示数组的第 i 个字符串,而不是您想要的名为 'newname' 的字符串的第 i 个字符。

    【讨论】:

      猜你喜欢
      • 2013-10-19
      • 2013-12-21
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 2019-05-29
      • 1970-01-01
      • 2014-04-04
      相关资源
      最近更新 更多