2015-09-18 2 views
1

Je suis encore novice en programmation mais disons que j'ai un tableau bidimensionnel char avec une lettre dans chaque tableau. Maintenant, j'essaie de combiner chacune de ces lettres dans le tableau en un seul tableau pour créer un mot.Combiner les caractères d'un tableau bidimensionnel dans une chaîne en C

Alors grid[2][4]:

0|1|2|3 
0 g|o|o|d 
1 o|d|d|s 

Et copie grid[0][0], grid[0][1], grid[0][2], grid[0][3] dans un seul tableau destination[4] il lit 'bon'. J'ai quelque chose comme

char destination[4]; 
strcpy(destination, grid[0][1]); 
for(i=0; i<4; i++) 
    strcat(destination, grid[0][i]); 

mais il se bloque tout simplement ..

Toute étape dans la bonne direction est appréciée.

Répondre

2

strcpy copie les chaînes, pas les caractères. Une chaîne dans C est une série de caractères, suivie d'un \0. Ce sont les chaînes dites "à terminaison nulle". Ainsi, vos appels à strcpy et strcat ne leur donnent pas le bon type de paramètres.

strcpy copie caractère après caractère jusqu'à ce qu'il atteigne \0; il ne copie pas seulement le caractère que vous lui donnez un pointeur.

Si vous voulez copier un caractère, vous pouvez simplement l'assigner.

char destination[5]; 
for(i = 0; i < 4; i++) 
    destination[i] = grid[0][i]; 
destination[i] = '\0'; 
+0

Comment pourrais-je aller sur la copie d'un char construire une chaîne puis? – RiGid

+0

Quelqu'un devrait proposer 'chrcpy' au comité C pour combler cette lacune si nécessaire. Après tout, nous avons 'strchr' et' strstr'. –

+0

@RiGid, Voir la mise à jour. – ikegami

3

En C, les fonctions de bibliothèque d'exécution strcpy et strcat ne nécessitent aucune chaînes terminées. Ce que vous leur remettez n'est pas terminé par zéro, et donc ces fonctions se bloqueront en raison de leur dépendance à l'égard de ce zéro de fin pour indiquer quand elles doivent s'arrêter. Ils parcourent la RAM jusqu'à ce qu'ils lisent un zéro, qui pourrait être n'importe où dans la RAM, y compris la RAM protégée en dehors de votre programme, provoquant un plantage. Dans un travail moderne, nous considérons que des fonctions telles que strcpy et strcat ne sont pas sûres. Tout type d'erreur en leur donnant des pointeurs provoque ce problème.

Les versions de strcpy et strcat existent, avec des noms légèrement différents, qui nécessitent un entier ou size_t indiquant leur taille maximale valide. strncat, par exemple, a la signature:

char * strncat(char *destination, const char *source, size_t num); 

Si, dans votre cas, vous aviez utilisé strncat, fournissant 4 pour le dernier paramètre, il ne serait pas écrasé.

Cependant, une alternative existe que vous préférerez peut-être explorer. Vous pouvez simplement utiliser l'indexation, comme dans:

char destination[5]; // I like room for a zero terminator here 

for(i=0; i<4; i++) 
    destination[i] = grid[0][i]; 

Cela ne gère pas la terminaison zéro, que vous pouvez ajouter avec:

destination[4] = 0; 

Maintenant, supposons que vous vouliez continuer, mettre les deux mots en une chaîne de sortie unique.Vous pourriez faire:

char destination[10]; // I like room for a zero terminator here 

int d=0; 
for(r=0; r<2; ++r) // I prefer the habit of prefix instead of postfix  
{ 
    for(i=0; i<4; ++i) 
    destination[d++] = grid[r][i]; 

    destination[d++] = ' ';// append a space between words 
} 

Après tout traitement nécessaire sur ce qui pourrait être une déclaration toujours plus pour la destination, ajoutez une terminaison zéro avec

destination[ d ] = 0;