将1-D阵列推入C中的2-D阵列

时间:2010-03-02 15:10:32

标签: c pointers arrays struct structure

我正在研究队列数据结构。结构是:

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)。

我对结构和指针相当新,所以可能有一些非常明显我不做的事情。感谢任何帮助:)

4 个答案:

答案 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)可能更好地避免缓冲区溢出