0

在 C++ 中,我可以很容易地分配一个字符串数组(比如 10 个字符串):

string* arrayOfString = new string[10];

但是我不知道如何在 ANSI C 中做到这一点。我试过:

char** arrayOfString = (*(char[1000])) malloc (sizeof (*(char[1000])));

但是编译器(MinGW 3.4.5)一直说它是“语法错误”。怎么做才对?谢谢。

4

3 回答 3

9

如果每个字符串的大小相同,在编译时已知,比如 100,那么你可以这样做1

typedef char cstring[100]; //cstring is a new type which is 
                           //a char array of size 100

cstring *arrstring = malloc (1000 * sizeof (cstring));

int i;
for( i = 0 ; i < 1000 ; ++i)
     strcpy(arrstring[i], "some string of size less than or equal to 100");

for( i = 0 ; i < 1000 ; ++i)
     printf("%s\n", arrstring[i]);

演示:http: //ideone.com/oNA30

1.请注意,正如@Eregrith在评论中指出的那样,如果您将代码编译为C,则不建议进行强制转换。但是,如果您将其编译为C++,那么您需要编写(cstring*)malloc (1000 * sizeof (cstring))但是然后在C++中,您应该避免编写这样的代码首先。std::vector<std::string> 正如本文底部所解释的,C++ 中的一个更好的选择是。

如果每个字符串的大小在编译时未知,或者每个字符串的大小不同,那么您可以这样做:

char **arrstring =  malloc(sizeof(char*) * 1000); //1000 strings!
int i;
for(i = 0 ; i < 1000; ++i)
     arrstring[i] = (char*) malloc(sizeof(char) * sizeOfString); 

我假设sizeOfString所有 1000 个字符串的大小相同。如果它们的大小不同,那么您必须在每次迭代中传递不同的值,如下所示:

for(i = 0 ; i < 1000; ++i)
     arrstring[i] = malloc(sizeof(char) * sizeOfEachString[i]); 

我希望这对你有帮助,我也希望你能自己做剩下的事情。


顺便说一句,在 C++ 中,你不应该这样做:

string* arrayOfString = new string[10]; //avoid new as much as possible!

相反,您应该这样做:

std::vector<std::string>  strings;
strings.reserve(10);
于 2012-04-12T08:21:30.190 回答
1

试试这个分配 100 个字符串。每个字符串的长度最多为 1000 个字符。

char** arrayOfString = (char**) malloc (sizeof(char[100][1000]));
于 2012-04-12T08:27:14.763 回答
0
#define N  10   // Number of strings
#define M  20   // Size of the strings

/* Please check malloc return value is not NULL */

char **arrayOfString = malloc(sizeof *arrayOfString * N);

for (i = 0; i < N; i++) {
    arrayOfString[i] = malloc(M);
}
于 2012-04-12T08:22:40.677 回答