簡體   English   中英

C++:舊 C 風格的字符串數組問題(如 Char**)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM