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

Posted

技术标签:

【中文标题】在 C++ 中的某些位置向字符串添加空格【英文标题】:Adding Space to String at certain places in 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(先生,你是个读心术师!) 【参考方案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 个字符。

【讨论】:

以上是关于在 C++ 中的某些位置向字符串添加空格的主要内容,如果未能解决你的问题,请参考以下文章

非托管 C++ 代码向托管代码发送字符串的错误

替换空格

Oracle db:如何在字符串的特定位置添加空格

2109. 向字符串添加空格

从字符串 C++ 中读取单词,同时忽略空格、数字和符号。

剑指offer 《替换空格》