2012-10-23 3 views
0

J'écris le tri par insertion en utilisant des chaînes. J'ai des tableaux ombles comme:initialisation de chaîne en C

char array1[4] = {'a', 'b', 'c', '\0'}; 
char array2[4] = {'b', 'd', 'e', '\0'}; 

Et je dois utiliser cette opération:

char string[2]; 
string[1] = array1; 
string[2] = array2; 

Est-il possible? Parce que dans le tri par insertion, j'ai besoin d'une chaîne de caractères. Ce est le code d'insertion:

char* insertionsort(char* a, int n) { 
    int k; 
    for (k = 1; k < n; ++k) { 
     int key = a[k]; 
     int i = k - 1; 

     while ((i >= 0) && (key < a[i])) { 
     a[i + 1] = a[i]; 
     --i; 
     } 

     a[i + 1] = key; 
    } 

    return a; 
} 
+1

Vos tableaux sont trop petits - il n'y a pas d'espace pour la terminaison nulle. Utilisez plutôt 'array1 []' pour les avoir automatiquement dimensionnés. – nneonneo

+0

Vos tableaux doivent avoir la taille '4', pas' 3'. Et 'char string [2];' était supposé être 'char * string [2]; – LihO

+0

ok J'ai modifié – lowcosthighperformance

Répondre

2

donc je dois écrire cette opération:

char string [2]; 
string[1] = array1; 
string[2] = array2; 

Est-il possible?

Réponse courte: non, ce n'est pas le cas. Les tableaux ne sont pas assignables. Vous pouvez utiliser strcpy pour copier les éléments d'une chaîne à une autre, mais dans ce cas cela ne fonctionnera pas non plus - vous avez défini string comme un tableau de 2 caractères, mais vous essayez d'assigner un tableau entier de caractères à chacun d'eux.

Il est pas tout à fait clair que c'est ce que vous voulez, mais une possibilité serait:

char *string[2]; 
string[1] = array1; 
string[2] = array2; 

Dans ce cas, string est un tableau de deux pointeurs char *, et les affectations définir ces à un point au premier caractère de chacune de vos chaînes définies précédemment.

Depuis que vous avez étiqueté cela comme C et C++, je vais ajouter un peu à ce sujet: cela est écrit comme beaucoup de code C. Si vous êtes en train de en C++, vous voulez probablement quelque chose comme:

std::string[2] = {"abc", "bde"}; 

Même en C, je préfère initialiser et les constantes de chaîne d'utilisation où ils font sens:

char array1[] = "abc"; 
char array2[] = "bde"; 

char *string[] = {array1, array2}; 

Ou même juste:

char const *string[] = {"abc", "bde"}; 
2
char array1[4] = {'a', 'b', 'c', '\0'}; // same as char *array1 = "abc"; 
char array2[4] = {'b', 'd', 'e', '\0'}; // same as char *array2 = "bde"; 

char *string [2]; // an array of 'pointers to chars'/array of strings 

string[1] = array1; // this will work 
string[2] = array2; // this will work 
+0

Merci Mark. Je suppose que je dois comprendre comment faire ressembler les choses au code. Mes excuses pour le dérangement casusing. –

0

Bien sûr que non. Rappelez-vous,

char ary[4] = {'a', 'b', 'c', '\0'}; //define an array of char 

Lorsque vous utilisez Ary comme ceci:

char string[2]; 
    string[0] = ary; 

dégénérés ary du nom d'un tableau à un pointeur! Donc, ce que vous faites ci-dessus est d'assigner un pointeur à un type de char, et qui conduira à un avertissement de type lors de la compilation.

Ceci est très important dans C!

Et vous pouvez le fixer comme ceci:

char *string[2];    //an array of pointers to char 
    string[1] = array1;   //correct 
    string[2] = array2;