2010-03-02 3 views
3

Je travaille sur une structure de données de file d'attente. La structure est:Pousser un tableau 1D sur un tableau 2-D dans C

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

Il est conçu pour stocker une liste de chaînes MAX_LENGTH qui sont 7 caractères de long. Je souhaite pousser un tableau 1D de 8 caractères (bien, 7 caractères et \ 0, tout comme le tableau dans la structure).

Je possède ce code Push:

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

Ce que je chiffre pourrait fonctionner, mais ne semble pas. Dans cl compilateur (de .net de C/C++), je reçois l'erreur suivante:

2.c(29) : error C2106: '=' : left operand must be l-value

gcc renvoie une erreur semblable, sur la même ligne (mais j'oublier, et ne pas avoir accès à gcc au moment). Je suis assez nouveau pour les structures, et les pointeurs donc il y a probablement quelque chose de très évident que je ne fais pas. Apprécierait toute aide :)

Répondre

2

Vous devez traiter q->array comme vous le feriez pour n'importe quel autre ensemble. Vous ne pouvez pas simplement "pousser", vous devez passer l'emplacement que vous voulez mettre puis copier chaque caractère (ou utiliser q-> retour comme votre emplacement). Quelque chose comme ça peut-être:

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'; 
} 

Ou utilisez strcpy:

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

Oh merci. strcopy aide grandement. –

5

Modifier à:

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

Vous pouvez attribuer struct en C en utilisant = mais vous ne pouvez pas affecter des tableaux - vous devez utiliser pour des choses strcpy/memcpy comme celui-ci.

+0

Peut-être ajouter un contrôle sur le dépassement de tampon? –

-1

strncpy (q-> array [q-> Retour], s, MAX_LENGTH) pourrait être mieux pour éviter le débordement de la mémoire tampon

+0

MAX_LENGTH n'est pas la bonne constante ici. –

+0

vous avez raison, je veux dire 8 –

+0

Avec strncpy(), vous devez vous assurer une annulation nulle; ce n'est pas le cas. Donc, vous auriez aussi besoin de 'q-> array [q-> back] [7] = '\ 0';'. Nous pouvons discuter si le dernier paramètre à strncpy() devrait être 8 (assez sûr) ou 7 (puisque vous êtes sur le point d'écraser la 8ème place ...). –

0

Si vous voulez une limite vérifié strcpy en utilisant uniquement les fonctions de la bibliothèque standard C, puis strncat est en fait votre meilleur pari:

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); 
} 

D'autre part, si vous connaissez pour certains que s pointe toujours à un tableau de la même taille que le tableau dans la struct (ce qu'indique votre question), alors memcpy est la solution la plus simple:

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