我試圖在 C 11 中連接兩個字串,但我經常遇到意外行為。
首先,我有一個將任何型別轉換為字串的函式:
template <class T>
static inline const char * toStr(T arg) {
stringstream ss;
ss << arg;
return (ss.str()).c_str();
}
然后,我像這樣使用這個函式:
string measure_name;
for (unsigned long j = 0; j < 1280; j ) {
measure_name = string("ADC_") toStr(j);
cout << measure_name << endl;
}
一切順利,直到我達到 4 位數字(> 999):我的變數measure_name通常等于“ADC_ADC_”......它隨機發生。我做了一些研究,但沒有發現這種奇怪的行為。
供您參考,如果toStr回傳 astring而不是 a ,則此問題已解決const char *。
另外,如果我嘗試列印回傳的值,我從來沒有看到它等于“ADC_ADC_”,所以我相信真正的問題來自連接指令:
string measure_name;
for (unsigned long j = 0; j < 1280; j ) {
const char* tmp = toStr(j);
if (!strcmp(toStr(j), "ADC_ADC_"))
cout << "bug" << endl; //never happens
measure_name = string("ADC_") tmp; //problem comes from here
cout << measure_name << endl;
}
我只是想了解我在那里做錯了什么......我知道我使用的是非常古老的 C ,但無論如何它應該可以作業。
謝謝你的幫助。
uj5u.com熱心網友回復:
這里
return (ss.str()).c_str();
您正在回傳一個指向臨時緩沖區的指標std::string(從 回傳str())。從函式回傳的指標對呼叫者來說是無用的,因為std::string它指向的指標已經消失了。
指標只是一個指標。如果你想要一個字串,回傳一個std::string. 如果你想回傳 aconst char*那么你需要將字串存盤在某個地方并管理它的生命周期。
std::string 確實管理字符陣列的生命周期,所以只需執行以下操作:
template <class T>
static inline std::string toStr(T arg) {
stringstream ss;
ss << arg;
return ss.str();
}
如果有人需要一個 c 陣列,char他們仍然可以呼叫c_str(只要std::string還活著就可以使用它)。
而不是您toStr考慮使用std::to_string.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/369578.html
上一篇:如何將字串設定為可選字串值?
下一篇:在GBQ中用星號替換第n個白色
