2017-06-05 1013 views
3

所以基本上我试图在字符串中添加一个字符。通常情况下,像Python这样的东西,这将是非常简单的,但我真的不知道如何在C++中实现这一点。我试图做到的,是这样的:在C++中的字符串之间添加一个字符

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

} 

所以基本上,我想添加一个char类型的变量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; 
} 

回答

2

你可以这样说:

converted = ":regional_indicator_" + std::string(1, character) + ":"; 

这工作,因为添加到字符串的字符串字面(const char *)产生的字符串。但增加const char *和char会导致指针运算。因此,通过从“字符”构造std::string,最终产生一个字符串const char * + std::string,然后std::string + const char *再次产生一个字符串作为最终结果。

+0

你可能应该解释*为什么这个特定的变体有效。 – Borgleader

+0

很确定'“:regional_indicator_”'应该使用字符串字面值,而且'const char *'不是['std :: string' literal](http://en.cppreference。com/w/cpp/string/basic_string/operator%22%22s) – Mgetz

+0

我刚刚结束将字符变量存储为字符串,将字符转换为字符串还有什么好处,而不是简单地从开始存储为字符串或相反亦然? – jacksons123

3

追加s字符串文字后面把他们当作std::string s,而不是const char* S:

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

你需要做的无论是using namespace std::literalsusing namespace std::string_literals为它工作。

请注意,在C++中,使用另一个全局变量修改全局变量的函数是012奇怪的。您可能需要考虑将character作为参数传递给函数。

0

的WASY方式来建立字符串是使用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...

1

您可以通过使用以下来避免调用std :: string()构造函数和内存分配。我在发布前已经测试了这一点,它的工作原理:

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

这是更好,因为“转换”已经会有一些额外的内存保留,所以你将只是填补这一额外的内存与两个字符,并不会被分配新的记忆。

相关问题