为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
POPMUISE 2019-11-11 12:08:34
如何在C中创建字符串数组?如果我使用以下代码,我将尝试在C中创建一个字符串数组:char (*a[2])[14];a[0]="blah";a[1]="hmm";GCC给了我“警告:来自不兼容指针类型的赋值”。正确的方法是什么?编辑:我很好奇为什么这会给编译器一个警告,因为如果我这样做了。printf(a[1]);它正确地打印了“嗯”。
查看完整描述

3 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

如果您不想更改字符串,那么您可以简单地

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每一个,然后将静态字符串的内容复制到它们中。



查看完整回答
反对 回复 2019-11-12
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

有几种方法可以在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元素数组。



查看完整回答
反对 回复 2019-11-12
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

常量字符串:

const char *strings[] = {"one","two","three"};

如果我没记错的话。

哦,你想用史克比对于赋值,不是=运算符。strcpy s更安全,但既不符合C89标准,也不符合C99标准。

char arr[MAX_NUMBER_STRINGS][MAX_STRING_SIZE]; strcpy(arr[0], "blah");




查看完整回答
反对 回复 2019-11-12
  • 3 回答
  • 0 关注
  • 384 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信