c++ - C++:旧的C风格的字符串数组存在问题(如Char **)

标签 c++ arrays pointers

早上好, 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/

相关文章:

arrays - 如果输入数组定义为 const,如何对其进行排序?

c - 哈希表中的链表(带结构)

c++ - 错误 : 'midfielder1' not declared in this scope

c - 使用动态分配的 C 矩阵乘法(程序崩溃)

c++ - 如何在 Chromium Embedded Framework (CEF) 中获取 JS 对象?

c++ - 简化复杂的方法

c++ - 为什么将空结构插入保留 vector 会增加内存?

arrays - 如何从文件中获取每一行的数据?

c++ - cout 打印对象 getter 后崩溃

java - 在 Java 中操作类的构造函数