在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;
}
答案 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个字符。