【问题标题】:Pushing a 1-D array onto a 2-D array in C将一维数组推入 C 中的二维数组
【发布时间】:2010-03-02 15:10:32
【问题描述】:

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

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

它旨在存储 7 个字符长的 MAX_LENGTH 个字符串列表。 我希望推送 8 个字符的一维数组(嗯,7 个字符和 \0,就像结构中的数组一样)。

我有这个推送代码:

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

我认为这可能有效,但显然无效。在 cl(.net 的 C/C++)编译器中,出现以下错误:

2.c(29) : 错误 C2106: '=' : 左操作数必须是左值

gcc 在同一行返回类似的错误(但我忘记了,目前无法访问 gcc)。

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

【问题讨论】:

    标签: c pointers arrays struct structure


    【解决方案1】:

    改成:

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

    您可以在 C 中使用 = 分配结构,但您不能分配数组 - 您必须使用 strcpy/memcpy 来处理此类事情。

    【讨论】:

    • 也许添加一些针对缓冲区溢出的检查?
    【解决方案2】:

    您必须像对待任何其他数组一样对待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);
    }
    

    【讨论】:

      【解决方案3】:

      如果你想要一个只使用标准 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]);
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 使用 strncpy(),您必须确保空终止;它没有。所以你还需要q->array[q->back][7] = '\0';。我们可以讨论 strncpy() 的最后一个参数应该是 8(足够安全)还是 7(因为你要覆盖第 8 位......)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-30
        • 2017-01-03
        • 1970-01-01
        • 1970-01-01
        • 2013-11-23
        相关资源
        最近更新 更多