Перенос 1-D массива на 2-D массив в C - PullRequest
3 голосов
/ 02 марта 2010

Я работаю над структурой данных очереди. Структура:

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

Он предназначен для хранения списка строк MAX_LENGTH длиной 7 символов. Я хочу выдвинуть одномерный массив из 8 символов (ну, 7 символов и \ 0, как массив в структуре).

У меня есть этот push-код:

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

Который, на мой взгляд, может работать, но, видимо, не работает. В компиляторе cl (.net C / C ++) я получаю следующую ошибку:

2.c (29): ошибка C2106: '=': левый операнд должен иметь значение l

gcc возвращает аналогичную ошибку в той же строке (но я забыл, и у меня нет доступа к gcc в данный момент).

Я довольно новичок в структурах и указателях, так что, вероятно, что-то очень очевидное, что я не делаю. Цени любую помощь:)

Ответы [ 4 ]

5 голосов
/ 02 марта 2010

Измените его на:

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

Вы можете назначать структуры в C, используя =, но вы не можете назначать массивы - вы должны использовать strcpy / memcpy для подобных вещей.

2 голосов
/ 02 марта 2010

Вы должны обращаться с 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);
}
0 голосов
/ 03 марта 2010

Если вы хотите проверить границы strcpy, используя только стандартные функции библиотеки C, то 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]);
}
0 голосов
/ 02 марта 2010

strncpy (q-> array [q-> back], s, MAX_LENGTH) может быть лучше, чтобы избежать переполнения буфера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...