具有动态分配的 char 数组的 strcpy 函数

strcpy function with dynamic allocated char array

我在使这段代码工作时遇到问题:

char **createCharArray() {
    char **charArray = new char*[PARAM_COUNT];
    for (int i = 0; i < PARAM_COUNT; ++i) {
        charArray[i] = new char[MAXSIZE];
    }
    return charArray;
}
 
void deleteCharArray(char **charArray) {
    for (int i = 0; i < PARAM_COUNT; ++i) {
        delete[] charArray[i];
    }
    delete[] charArray;
}    

int main(){
    char ** test = createCharArray(); 
    char *asd = new char[MAXSIZE];
    cin >> asd;

    for (int i = 0; i < PARAM_COUNT; ++i) {
        strcpy_s(test[i], asd);
    }

    for (int i = 0; i < PARAM_COUNT; ++i) {
        cout << i << " " << test[i] << endl;
    }

    deleteCharArray(test);
    return 0;
}

如何将该字符串复制到 char 数组中,我在哪里弄错了?

编辑:正如 Igor Tandetnik 和 user17732522 在评论中以及 Joseph Larson 在下面的回复中所回答的那样,通过向 strcpy_s 函数添加缓冲区参数解决了这个问题,使其总共有 3 个参数。

有几件事我觉得很麻烦。首先,您看到有人说您应该使用 std::string 而不是 char 数组,这是真的。但是新程序员应该了解整个语言,因此了解如何使用 char 数组是有价值的。

所以让我们忽略 C++ 字符串并查看您的代码:

char ** test = createCharArray(); // array of pointers to char arrays
char *asd = new char[MAXSIZE];
cin >> asd;

for (int i = 0; i < PARAM_COUNT; ++i) {
    strcpy_s(test[i], asd);
}

for (int i = 0; i < PARAM_COUNT; ++i) {
    cout << i << " " << test[i] << endl;
}

deleteCharArray(test);
return 0;

让我们从这个开始。我们不知道 createCharArray() 是做什么的。它正在做它应该做的一切吗?它不仅应该创建一个 char 指针数组,而且按照您使用它的方式,它还需要创建它们各自指向的缓冲区。所以它可能看起来像这样:

char ** createCharArray() {
   char ** array = new char *[PARAM_COUNT];
   for (int index = 0; index < PARAM_COUNT; ++index) {
        array[index] = new char[MAXSIZE];
   }
   return array;
}

如果您的看起来明显不同,则您可能遇到了问题。

说完,再看这个:

for (int i = 0; i < PARAM_COUNT; ++i) {
    strcpy_s(test[i], asd);
}

正如其他人所说,这个版本的 strcpy_s 有三个参数: strcpy_s(测试[i], asd, MAXSIZE);

请注意,您要将同一个字符串多次复制到位。我想知道您的代码是否真的应该这样做:

for (int i = 0; i < PARAM_COUNT; ++i) {
    cin >> asd;
    strcpy_s(test[i], asd, MAXSIZE);
}

最后,delete 方法需要先删除单个指针,然后再删除指针数组。