在C++中在字符串之间添加一个字符

3

基本上我正在尝试在字符串中间添加一个字符。通常在像Python这样的语言中,这将非常简单,但是我真的不知道如何在C++中实现这一点。我的目标是实现以下内容:

void converter(){
    converted = ":regional_indicator_" + character + ":";

}

基本上,我正在尝试在字符串中添加类型为 char 的变量 character。我应该将 character 存储为字符串吗?

以下是我所有的代码:

#include <iostream>

using namespace std;

string inputLine;
char character;
string converted;

void input(){
    cout << "Please input the text in which you would like to be converted" << endl;
    cin >> inputLine;
}


void converter(){
    converted = ":regional_indicator_" + character + ":";

}
int main(){
    input();
    for (int i = 0; i < inputLine.length(); i++ ){
        character = tolower(inputLine[i]);
    }
    return 0;
}
4个回答

4

将字符串字面量后面添加s,以将其视为std::string而不是const char*

converted = ":regional_indicator_"s + character + ":"s;

为了使其工作,您需要执行using namespace std::literalsusing namespace std::string_literals中的任意一个。

顺便提一下,在C++中,使用一个名为converter()的函数来使用另一个全局变量修改全局变量是很奇怪的。您可能希望考虑将character作为参数传递给函数。


3
你可以这样做:
converted = ":regional_indicator_" + std::string(1, character) + ":";

这是因为将字符串字面量(const char *)添加到字符串中会得到一个新的字符串。但是,将const char *和char相加会产生指针运算。因此,通过从“字符”构造一个std::string,您最终会得到一个由const char * + std::string组成的字符串,再次将std::string + const char *相加,最终得到一个新的字符串。

你应该解释一下为什么这个特定的变体会起作用。 - Borgleader
相信 ":regional_indicator_" 应该使用字符串字面量,而且 const char* 不是 std::string 字面量 - Mgetz
我最终将字符变量存储为字符串,将字符转换为字符串而不是从一开始就将其存储为字符串或反之是否有任何优势? - jacksons123
更新了答案。 - Jesper Juhl
@jacksons123 不是很多,但如果编译器没有意识到该字符串是一个从未被修改的全局变量,它可能会稍微慢一些并且需要额外的堆内存分配。 - Bernard

1

您可以通过使用以下方法避免调用std::string()构造函数和内存分配。在发布之前,我进行了测试,并且它可以正常运行:

void converter(){
    converted = ":regional_indicator_";
    converted.push_back(character);
    converted.push_back(':');
}

这样做更好,因为“转换”已经预留了一些额外的内存,所以您只需要用两个字符填充那些额外的内存,而不需要分配新的内存。


0
构建字符串的简单方法是使用 std::ostringstream,示例如下:

void converter(){

    std::ostringstream oss;
    oss << ":regional_indicator_" << character << ":";

    converted = oss.str(); // copy the string out

    // ... etc ...
}

这种方法的附加优势是它可以自动将数字转换为字符串。

如果速度很重要,那么这并不是最快的方法,我会利用这种连接的静态特性,像这样:

std::string converter(){

    static char* template = ":regional_indicator_X:";
    template[20] = character; // replace the `X` with your character
    converted.assign(template, 21); // assign your string all at once

    // ... etc ...
}

这能用是因为你的字符串长度是固定的。如果需要线程安全,你可以使用 thread_local static char* template...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接