[英]C++: Problem with array of strings old C-style (as Char**)
早上好,朋友,
作為協作開發的一部分,我目前正在處理大量代碼(CFD 求解器)。 我不是一個有經驗的開發人員,因此這個問題可能看起來很愚蠢,但我遇到了一個我無法解決的問題。 我正在嘗試修改一組舊式 C 字符串 (char**)。
在下面的部分中,我將編寫參考問題的代碼的重要部分。 我無法編寫整個代碼(因為它是一個巨大的代碼(數百萬行),但理解底層問題應該不是問題)。 問題出現在編寫代碼的最后一部分。
PV->noVariables 和 m_noSpecies 是之前聲明的整數。 MInt 和 MChar 是用戶定義的數據類型。
const MChar** m_variablesName;
(...)
m_variablesName = new const MChar*[PV->noVariables];
for(MInt i = 0; i < PV->noVariables; ++i) {
m_variablesName[i] = new MChar[10];
}
MInt count = 0;
m_variablesName[count] = "u";
count++;
m_variablesName[count] = "v";
count++;
if(nDim == 3) {
m_variablesName[count] = "w";
count++;
}
m_variablesName[count] = "rho";
count++;
m_variablesName[count] = "p";
count++;
(... some not relevant code...)
// here lies the problem
if(m_noSpecies > 1) {
for (MInt s = 0; s < m_noSpecies; s++){
m_variablesName[count] = ("Y_" + std::to_string(s)).c_str();
cerr << ("Y_" + std::to_string(s)).c_str() << endl;
count++;
}
}
// to check the values stored in m_variablesName
for (MInt n = 0; n < PV->noVariables; ++n)
cerr << m_variablesName[n] << endl;
(... irrelevant code ...)
控制台中的輸出如下:
第一個輸出塊:
Y_0
Y_1
Y_2
Y_3
Y_4
Y_5
Y_6
Y_7
Y_8
Y_9
Y_10
Y_11
Y_12
Y_13
Y_14
Y_15
Y_16
Y_17
第二塊輸出:
u
v
rho
p
Y_17
Y_17
Y_17
Y_17
Y_17
Y_17
Y_17
Y_17
Y_17
Y_17
Y_17
Y_17
Y_17
Y_17
Y_17
Y_17
Y_17
Y_17
可以看到,Y_0 到 Y_17 都變成了 Y_17,這是不希望的。 如果我正確理解了問題,我認為問題在於每個數組條目中存儲了相同的指針,因此所有條目都獲得相同的值。
但是,我不知道如何解決這個問題。 一些幫助可能不勝感激。 由於兼容性原因,無法更改數組以使用普通 C++ 字符串。
謝謝大家的時間!
從你的問題中挑選櫻桃,這一行
m_variablesName[i] = new MChar[10];
在堆上為 10 個 MChars 分配空間並將指針存儲在m_variablesName[i]
。
有問題的線路是
m_variablesName[count] = ("Y_" + std::to_string(s)).c_str();
它將該指針替換為指向臨時對象的指針,因為"Y_" + std::to_string(s)
是臨時對象。
在這種情況下,您可以改用snprintf
將正確的字符寫入第一個緩沖區:
snprintf(m_variablesName[count], 10, "Y_%d", s);
您還可以將這兩個步驟與asprintf
函數asprintf
,該函數asprintf
分配和打印。
此代碼段中的所有m_variablesName[count]
均由
for (MInt i = 0; i < PV->noVariables; ++i) {
m_variablesName[i] = new MChar[10];
}
這些 C 風格的字符串不能直接賦值,你應該使用strncpy
等函數將內容復制到:
for (MInt s = 0; s < m_noSpecies; s++) {
memset(m_variablesName[count], 0, 10);
std::string strtmp = "Y_" + std::to_string(s);
strncpy(m_variablesName[count], strtmp.c_str(), 9);
count++;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.