具有动态分配的 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 方法需要先删除单个指针,然后再删除指针数组。
我在使这段代码工作时遇到问题:
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 方法需要先删除单个指针,然后再删除指针数组。