早上好, friend ,
作为协作开发的一部分,我目前正在处理大量代码(CFD求解器)。我不是一个经验丰富的开发人员,因此这个问题似乎很愚蠢,但是我遇到了一个我无法解决的问题。我正在尝试修改旧式C字符串(char **)的数组。
在下面的部分中,我将编写代码中涉及该问题的重要部分。我不能编写完整的代码(因为它是一个巨大的代码(数百万行),但是在理解潜在问题上应该不成问题)。该问题出现在编写代码的最后一部分。
PV-> noVariables和m_noSpecies是之前声明的int。
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[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++;
}
关于c++ - C++:旧的C风格的字符串数组存在问题(如Char **),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64854677/