2011-01-22 8 views
1

Doublons possibles:
string literal in c
Assigning strings to arrays of characterstableaux de chaînes C

je suis arrivé le code suivant:

char result[3][4]; 

result[0] = "horse"; 
result[1] = "pig"; 
result[2] = "chicken"; 

Il ne compilera pas dire Incompatible types in assignment. Qu'est-ce que je fais mal?

+0

Eh bien ce sont des caractères char * et non char [4] ... – leppie

+0

@birryree: Cette question a son propre duplicata possible http://stackoverflow.com/questions/579734/assigning-strings-to-arrays-of- caractères –

Répondre

4

omble est un seul char, par exemple 'h'

Ce que vous voulez est des pointeurs de chaîne.

char *result[3]; 

Rappelez-vous si vous le faites de cette façon vous ne serez pas en mesure de modifier le contenu d'une chaîne individuelle (il est une constante et stocké dans un endroit différent.)

Vous pouvez aussi faire quelque chose comme celui-ci

char *result[3]; 

result[0] = malloc(100 * sizeof(char)); 
strcpy(result[0],"horse"); // or strncpy(result[0],5,"horse") 
etc 
+0

Dans l'exemple d'OP 'result' est un' char [3] [4] ', et' result [i] 'est donc un' char [4] ', pas un' char'. – peoro

+0

@peoro: vrai. Je pourrais peut-être mieux formuler la réponse. – Hogan

+0

@ user282635: lisez aussi cette réponse, cela pourrait rendre les choses plus claires. http://stackoverflow.com/questions/579734/assigning-strings-to-arrays-of-characters – Hogan

1

vous avez probablement voulu:

char* result[3]; 
result[0] = "horse"; 
result[1] = "pig"; 
result[2] = "chicken"; 

ce que vous avez eu tort pour deux les raisons. D'abord, vous ne pouvez pas "assigner" une chaîne à un tableau char comme ça, vous devez utiliser, par exemple, strcpy.

Deuxièmement, votre dimension de tableau était également erroné, char array[4] évidemment ne tiendrez pas "horse" ou "chicken", il ne fonctionnerait pas même si vous corrigiez ce que je disais ci-dessus (il rassemblerait, mais vous écrirais à la mémoire vous ne devrait pas écrire à). Ce que fait le code corrigé, au lieu de stocker le tableau char en soi, il stocke un pointeur sur l'emplacement dans la mémoire où sont stockés "horse", etc. Par conséquent, il stocke simplement une adresse, et vous pouvez ensuite utiliser l'opérateur =.

1

Les tableaux ne sont pas modifiables lvalues et vous ne pouvez pas les affecter.

Vous devez utiliser un tableau de pointeurs. Changer char result[3][4];-

-1

Vous devez augmenter la taille des mots et utiliser strcpy():

char result[3][8]; // at least 8! 

strcpy(result[0], "horse"); 
strcpy(result[1], "pig"); 
strcpy(result[2], "chicken"); 
+0

@downvoter: avez-vous essayé de compiler mon code et de l'exécuter ?? Cela fonctionne parfaitement! – BlackBear

+0

Votre code initial était un non-sens et vous le savez. Si vous aviez dit "Je l'ai réparé pour que ce ne soit plus un non-sens", j'aurais supprimé le downvote. Au lieu de cela, vous choisissez de jouer stupide, de sorte que le downvote reste. –

+0

@Nicholas: Je ne vous connaissais pas downvoted __avant__ je l'ai réparé. – BlackBear

2
char result[3][10] = { 
    "horse", 
    "pig", 
    "chicken", 
} 

ou

char result[3][10]; 

strcpy_s(result[0], 10, "horse"); 
strcpy_s(result[1], 10, "pig"); 
strcpy_s(result[2], 10, "chicken"); 
0

Vous pouvez assigner une chaîne littérale (par exemple: "horse") à un tableau char uniquement lorsque vous le déclarez, et non après.

char array[4] = "str"; // is OK 
char array2[4]; 
array2 = "str"; // is NOT OK. 

Vous pouvez faire comme ceci:

char result[3][4] = { "horse", "pig", "chicken" }; 

mais avertissement: "horse" et "chicken" sont plus longs que char[4].


Si vous souhaitez attribuer une chaîne littérale à un tableau char déjà déclaré que vous devrez utiliser strcpy (ou d'autres fonctions similaires).


L'autre solution, suggérée par beaucoup est de déclarer result comme un tableau de pointeurs char: char *result[3];, mais si vous aimez cela, vous ne sera pas autorisé à modifier le contenu des chaînes pointées par result[i].

1

Ce qui fonctionne mieux: résultat char [3] [10] = {"cheval", "cochon", "poulet"}; En outre, gardez à l'esprit que "poulet" et "cheval" ont plus de 4 caractères et que par conséquent le résultat [3] [4] (la partie [4]) n'est pas correct.

1

Cela ne fonctionnera pas parce result déclaré que char result[3][4] et utilisé comme result[0] se traduira par quelque chose similaire avec: char * const result. Le pointeur constant n'admet aucune affectation, il contient déjà un pointeur sur le tableau de colonnes "[4]".