在 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() > 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++ 中的某些位置向字符串添加空格的主要内容,如果未能解决你的问题,请参考以下文章