3
votes

Comment puis-je faire en sorte qu'un tableau de chaînes échange ses composants avec une fonction d'échange?

Le problème est que ce code n'échangera pas ces 2 chaînes. Je suis nouveau dans la programmation mais je peux dire que le problème est cette fonction de swap, mais je ne sais pas comment le résoudre.

J'ai essayé d'ajouter strcpy au lieu de "=" dans swap mais cela n'a pas fonctionné.

#include <stdio.h>
#include <stdlib.h>

void swap(char *t1, char *t2) {
    char *t;
    t=t1;
    t1=t2;
    t2=t;
}
int main() {
    char *s[2] = {"Hello", "World"};
    swap(s[0], s[1]);
    printf("%s\n%s", s[0], s[1]);
    return 0;
}


1 commentaires

N'oubliez pas qu'en C tous les arguments de fonction sont passés par valeur , ce qui signifie que leurs valeurs sont copiées. Lorsque vous modifiez une copie, l'original ne sera pas modifié. Faites des recherches sur l ' émulation du passage par référence en C .


3 Réponses :


6
votes

Vous voulez utiliser les paramètres out ici, et comme vos chaînes sont représentées comme des pointeurs, vous avez besoin de pointeurs vers des pointeurs:

char s[2][16] = { "Hello", "World" }; // strings are copied to the stack now

Appelez-le comme ceci:

void swap(char *t1, char *t2) {
    char buf[16]; // needs to be big enough to fit the string
    strcpy(buf, t1);
    strcpy(t1, t2);
    strcpy(t2, buf);
}

J'ai essayé d'ajouter strcpy au lieu de "=" dans swap mais cela n'a pas fonctionné.

La raison pour laquelle cela ne fonctionne pas est que les chaînes sont en fait stockées dans le binaire du programme et ne peuvent donc pas être modifiées, et avec strcpy vous écririez dessus. Si vous les copiez dans la pile ou le tas à la place, vous pouvez effectuer l'échange avec strcpy . Bien sûr, ce sera moins efficace que de simplement échanger les pointeurs, mais voici à quoi cela ressemblerait:

swap(&s[0], &s[1]);

Vous devrez également changer la définition de s à quelque chose qui ressemble à

void swap(char **t1, char **t2) {
    char *t;
    t = *t1;
    *t1 = *t2;
    *t2 = t;
}


1 commentaires

Merci beaucoup pour votre réponse!



2
votes

Vérifiez attentivement les types.

Ce que vous avez en tant que membres du tableau sont des pointeurs (vers l'élément de départ des chaînes littérales). Vous devez permuter les membres de manière à ce qu'ils pointent vers l'autre chaîne littérale. Donc, vous devez changer ces pointeurs eux-mêmes.

Donc, vous devez passer le pointeur vers ces pointeurs, puis effectuer le changement à partir de la fonction appelée.

Faites quelque chose comme p >

void ptrSwap(char **t1, char **t2) {
    char *temp;
    temp=*t1;
    *t1=*t2;
    *t2=temp;
}

puis, dans la fonction appelée:

swap(&(s[0]), &(s[1]));

Points bonus: Nommez vos fonctions (et vos variables aussi, le cas échéant) de manière significative.


1 commentaires

Merci beaucoup pour votre réponse!



2
votes

Vous devez passer le pointeur du pointeur, c'est-à-dire l'adresse de la position dans le tableau où les chaînes sont présentes, afin de pouvoir échanger et y placer les adresses correctes.

Essayez le code ci-dessous:

World
Hello

Résultat:

#include <stdio.h>
#include <stdlib.h>

void swap(char **t1, char **t2) {
    char *t;
    t=*t1;
    *t1=*t2;
    *t2=t;
}
int main() {
    char *s[2] = {"Hello", "World"};
    swap(&s[0], &s[1]);
    printf("%s\n%s", s[0], s[1]);
    return 0;
}


1 commentaires

Merci beaucoup pour votre réponse!