在C中将一维数组推到二维数组上
我正在处理队列数据结构。结构如下:在C中将一维数组推到二维数组上,c,pointers,arrays,struct,structure,C,Pointers,Arrays,Struct,Structure,我正在处理队列数据结构。结构如下: struct queue { char array[MAX_LENGTH][8]; int back; }; 它用于存储长度为7个字符的最大长度字符串列表。 我希望推送一个8个字符的1D数组(好吧,7个字符和\0,就像结构中的数组一样) 我有这个推码: void push (struct queue *q, char s[]){ q->array[q->back] = s; } 我想这可能行得通,但显然不行。在cl(.net的C/C++)
struct queue
{
char array[MAX_LENGTH][8];
int back;
};
它用于存储长度为7个字符的最大长度字符串列表。
我希望推送一个8个字符的1D数组(好吧,7个字符和\0,就像结构中的数组一样)
我有这个推码:
void push (struct queue *q, char s[]){
q->array[q->back] = s;
}
我想这可能行得通,但显然不行。在cl(.net的C/C++)编译器中,我得到以下错误:
2.c(29):错误C2106:“=”:左操作数必须是l值
gcc在同一行上返回一个类似的错误(但我忘记了,目前无法访问gcc)
我对结构和指针相当陌生,所以可能有一些非常明显的事情我没有做。感谢您的帮助:)将其更改为:
void push (struct queue *q, char s[])
{
strcpy(q->array[q->back], s);
}
您可以使用
=
在C中分配结构,但不能分配数组-您必须使用strcpy/memcpy来处理类似的事情。您必须像对待任何其他数组一样对待q->array
。你不能只是“推”它,你必须传递你想要放置它的位置,然后复制每个字符(或者使用q->back作为你的位置)。也许是这样的:
void push (struct queue *q, char s[]){
int i;
for ( i = 0; s[i]; ++i )
q->array[q->back][i] = s[i];
q->array[q->back][i] = '\0';
}
或者使用strcpy
void push (struct queue *q, char s[]){
strcpy(q->array[q->back], s);
}
strncpy(q->array[q->back],s,MAX_LENGTH)可以更好地避免缓冲区溢出如果您只想使用标准C库函数检查边界,那么strncpy
实际上是您最好的选择:
void push (struct queue *q, char s[])
{
q->array[q->back][0] = 0;
strncat(q->array[q->back], s, sizeof q->array[q->back] - 1);
}
另一方面,如果您确定s
始终指向与结构中的数组大小相同的数组(如您的问题所述),则memcpy
是最简单的解决方案:
void push (struct queue *q, char s[])
{
memcpy(q->array[q->back], s, sizeof q->array[q->back]);
}
也许可以添加一些针对缓冲区溢出的检查?使用strncpy(),您必须确保空终止;没有。所以您还需要q->array[q->back][7]='\0'代码>。我们可以讨论strncpy()的最后一个参数是8(足够安全)还是7(因为您将要覆盖第8位…)。