如何在C中创建字符串数组?

如何在C中创建字符串数组?

如果我使用以下代码,我将尝试在C中创建一个字符串数组:

char (*a[2])[14];a[0]="blah";a[1]="hmm";

GCC给了我“警告:来自不兼容指针类型的赋值”。正确的方法是什么?

编辑:我很好奇为什么这会给编译器一个警告,因为如果我这样做了。printf(a[1]);它正确地打印了“嗯”。



POPMUISE
浏览 385回答 3
3回答

长风秋雁

如果您不想更改字符串,那么您可以简单地const char *a[2];a[0] = "blah";a[1] = "hmm";当您这样做时,您将分配一个由两个指针组成的数组const char..然后,这些指针将被设置为静态字符串的地址。"blah"和"hmm".如果您确实希望能够更改实际的字符串内容,则必须执行以下操作char a[2][14];strcpy(a[0], "blah");strcpy(a[1], "hmm");这将分配两个连续的14数组。charS每一个,然后将静态字符串的内容复制到它们中。

守着星空守着你

有几种方法可以在C中创建字符串数组。如果所有字符串都要具有相同的长度(或至少具有相同的最大长度),只需声明一个二维char数组并根据需要分配:char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1];...strcpy(strs[0], aString);  // where aString is either an array or pointer to charstrcpy(strs[1], "foo");还可以添加初始化程序列表:char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};这假设初始化器中字符串的大小和数量与数组维度匹配。在这种情况下,每个字符串文本的内容(它本身是一个以零结尾的char数组)被复制到分配给STR的内存中。这种方法的问题在于内部碎片的可能性;如果您有99个字符串,不超过5个字符,但是有一个字符串,长度为20个字符,那么99个字符串将至少有15个未使用的字符;这是对空间的浪费。您可以存储指向char的指针的一维数组,而不是使用char的二维数组:char *strs[NUMBER_OF_STRINGS];请注意,在本例中,您只分配了内存来保存指向字符串的指针;字符串本身的内存必须在其他地方分配(或者作为静态数组,或者使用malloc()或calloc()。可以使用初始化程序列表,如前面的示例所示:char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};不是复制字符串常量的内容,而是简单地存储指向它们的指针。请注意,字符串常量可能不可写;您可以重新分配指针,如下所示:strs[i] = "bar";strs[i] = "foo";但是您可能无法更改字符串的内容;即,strs[i] = "bar";strcpy(strs[i], "foo");可能是不允许的。可以使用malloc()为每个字符串动态分配缓冲区,并将其复制到该缓冲区:strs[i] = malloc(strlen("foo") + 1);strcpy(strs[i], "foo");顺便说一下,char (*a[2])[14];声明为指向char的14元素数组的指针的2元素数组。

陪伴而非守候

常量字符串:const char *strings[] = {"one","two","three"};如果我没记错的话。哦,你想用史克比对于赋值,不是=运算符。strcpy s更安全,但既不符合C89标准,也不符合C99标准。char arr[MAX_NUMBER_STRINGS][MAX_STRING_SIZE]; strcpy(arr[0], "blah");
打开App,查看更多内容
随时随地看视频慕课网APP