如何管理二维字符数组?
How to Manage a 2 Dimensional Char Array?
阅读了数十个教程和编程指南后,答案并不明显,因此 post。请善待。
手头的问题是 char 的双 d 数组的实际操作:{"aaaaa"、"bbbbb"、"ccccc"、.... M}
第一个问题是声明这样的野兽的初始化,以更改字符串 "aaaaa"、"bbbbb" 等
中的数据
声明和初始化如下:
char *chararray[M][N + 1] //M & N are set as constant values, the extra 1 for the null terminator.
memset (chararray, '[=10=]', sizeof(chararray)); //Assuming array bounds remain constant, in the hope that dynamic allocation is not required
假设还定义了一个字符串文字:
char *copyme; //Has been given a string value well within the bounds of N
尝试在 strcat 或 strcat_s(strcpy 或 strcpy_s 类似)中使用它时出现问题:
strcat_s (chararray [i][0], N + 1, (char *) copyme); //i ranges from 0 to M
由于没有遇到任何以这种方式处理数组的代码,我确实从这篇 tutorial 中注意到 memcpy 是唯一的方法。正确吗?
此外,如何在从 Main 调用函数时实现 John Bode 的 General Procedure? (为了简洁起见,这可能必须作为一个单独的问题提交,)
你的意思可能是
char chararray[M][N + 1];
然后复制你指定第一个索引的字符串
strcat_s(chararray[i], N + 1, (char *) copyme);
如果您已将其声明为
char *chararray[M][N + 1]
然后你有一个二维指针数组,它是 NULL 然后当你取消引用它们时你会得到一个错误:
strcat_s(chararray [i][0], N + 1, (char *) copyme); // boom!
您的初始化是错误的,您声明的是 指针 而非字符的二维数组。将其更改为 char chararray[M][N + 1]
。
另外关于对 memset 的评论,你用静态维度声明了数组,所以边界永远不会改变,如果你选择了上述方法,你就不能使用动态分配。
基本上在 C 中使用字符串数组时有以下选项:
- 如果您只处理只读字符串文字,则可以为每个文字使用
const char*
。在这种情况下,字符串数组将是 const char*
指针数组。
- 类似地,如果字符串分配在其他地方,而不是在您的数组中,您可能会有一个指针数组。您需要查找 table.
- 如果字符串的长度有一个已知的最大值,您可以用静态维度声明它,例如
char chararray[M][N + 1]
。这是一个二维字符数组,或者如果您愿意:字符数组的数组。
- 如果字符串的长度未知,如果您需要它们的灵活性,或者如果您正在分配大量字符串(数百个),您可以在堆上分配它们。在这种情况下,您应该使用一个指针数组,其中每个指针通过 malloc 后跟 strcpy() 分配一个字符串。
阅读了数十个教程和编程指南后,答案并不明显,因此 post。请善待。
手头的问题是 char 的双 d 数组的实际操作:{"aaaaa"、"bbbbb"、"ccccc"、.... M}
第一个问题是声明这样的野兽的初始化,以更改字符串 "aaaaa"、"bbbbb" 等
中的数据
声明和初始化如下:
char *chararray[M][N + 1] //M & N are set as constant values, the extra 1 for the null terminator.
memset (chararray, '[=10=]', sizeof(chararray)); //Assuming array bounds remain constant, in the hope that dynamic allocation is not required
假设还定义了一个字符串文字:
char *copyme; //Has been given a string value well within the bounds of N
尝试在 strcat 或 strcat_s(strcpy 或 strcpy_s 类似)中使用它时出现问题:
strcat_s (chararray [i][0], N + 1, (char *) copyme); //i ranges from 0 to M
由于没有遇到任何以这种方式处理数组的代码,我确实从这篇 tutorial 中注意到 memcpy 是唯一的方法。正确吗?
此外,如何在从 Main 调用函数时实现 John Bode 的 General Procedure? (为了简洁起见,这可能必须作为一个单独的问题提交,)
你的意思可能是
char chararray[M][N + 1];
然后复制你指定第一个索引的字符串
strcat_s(chararray[i], N + 1, (char *) copyme);
如果您已将其声明为
char *chararray[M][N + 1]
然后你有一个二维指针数组,它是 NULL 然后当你取消引用它们时你会得到一个错误:
strcat_s(chararray [i][0], N + 1, (char *) copyme); // boom!
您的初始化是错误的,您声明的是 指针 而非字符的二维数组。将其更改为 char chararray[M][N + 1]
。
另外关于对 memset 的评论,你用静态维度声明了数组,所以边界永远不会改变,如果你选择了上述方法,你就不能使用动态分配。
基本上在 C 中使用字符串数组时有以下选项:
- 如果您只处理只读字符串文字,则可以为每个文字使用
const char*
。在这种情况下,字符串数组将是const char*
指针数组。 - 类似地,如果字符串分配在其他地方,而不是在您的数组中,您可能会有一个指针数组。您需要查找 table.
- 如果字符串的长度有一个已知的最大值,您可以用静态维度声明它,例如
char chararray[M][N + 1]
。这是一个二维字符数组,或者如果您愿意:字符数组的数组。 - 如果字符串的长度未知,如果您需要它们的灵活性,或者如果您正在分配大量字符串(数百个),您可以在堆上分配它们。在这种情况下,您应该使用一个指针数组,其中每个指针通过 malloc 后跟 strcpy() 分配一个字符串。