在C语言中将一个一维数组添加到二维数组中

3

我正在处理一个队列数据结构。该数据结构如下:

struct queue
{
 char array[MAX_LENGTH][8];
 int back;
};

这个程序旨在存储一个最大长度为MAX_LENGTH的字符串列表,其中每个字符串长度为7个字符。

我希望推送一个包含8个字符的一维数组(就像结构体中的数组一样,有7个字符和\0)。

这是我的推送代码:

void push (struct queue *q, char s[]){
 q->array[q->back] = s;
}

我认为这个方法可能有效,但实际上并没有。在cl (.net的C/C++)编译器中,我得到以下错误:

2.c(29) : error C2106: '=' : 左操作数必须是l-value

gcc返回类似的错误,在同一行(但我忘了,并且暂时无法访问gcc)。

我对结构体和指针比较新,所以可能有很明显的问题我没有注意到。感谢任何帮助 :)

4个回答

5

将其更改为:

void push (struct queue *q, char s[])
{
    strcpy(q->array[q->back], s);
}

在C语言中,你可以使用=给结构体赋值,但是你不能直接给数组赋值,你需要使用strcpy/memcpy之类的函数。


也许可以对缓冲区溢出进行一些检查? - Jonathan Leffler

2
您需要像对待其他数组一样处理q->array。您不能仅仅“push”它,您必须传递您想要放置的位置,然后复制每个字符(或将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);
}

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始终指向与结构体中的数组大小相同的数组(如您的问题所述),那么memcpy是最简单的解决方案:

void push (struct queue *q, char s[])
{
    memcpy(q->array[q->back], s, sizeof q->array[q->back]);
}

-1

为避免缓冲区溢出,strncpy(q->array[q->back], s,MAX_LENGTH) 可以更好地处理。


使用strncpy()时,您必须确保空终止符;它不会自动添加。因此,您还需要q->array[q->back][7] = '\0';。我们可以讨论最后一个参数应该是8(足够安全)还是7(因为您即将覆盖第8个位置...)。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接