2017-06-05 1021 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(':'); 
} 

這是更好,因爲「轉換」已經會有一些額外的內存保留,所以你將只是填補這一額外的內存與兩個字符,並不會被分配新的記憶。

相關問題