我正在研究队列数据结构。结构是:
struct queue
{
char array[MAX_LENGTH][8];
int back;
};
它旨在存储一个长度为7个字符的MAX_LENGTH字符串列表。 我希望推出一个包含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)。
我对结构和指针相当新,所以可能有一些非常明显我不做的事情。感谢任何帮助:)
答案 0 :(得分:5)
将其更改为:
void push (struct queue *q, char s[])
{
strcpy(q->array[q->back], s);
}
你可以使用=
在C中指定结构但是你不能分配数组 - 你必须使用strcpy / memcpy来做这样的事情。
答案 1 :(得分:2)
您必须像对待任何其他阵列一样对待q->array
。你不能只是“推”它,你必须通过你想要的位置然后复制每个字符(或使用q->返回作为你的位置)。也许是这样的事情:
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);
}
答案 2 :(得分:0)
如果您想要仅使用标准C库函数进行边界检查strcpy
,那么strncat
实际上是您最好的选择:
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
始终指向与结构中的数组大小相同的数组(如您的问题所述),那么{ {1}}是最简单的解决方案:
memcpy
答案 3 :(得分:-1)
strncpy(q-> array [q-> back],s,MAX_LENGTH)可能更好地避免缓冲区溢出