Échange transparent de pointeurs vers des tableaux de caractères en C ++

StackOverflow https://stackoverflow.com/questions/125094

  •  02-07-2019
  •  | 
  •  

Question

J'ai un tableau de caractères 2D:
char nm [MAX1] [MAX2] = {"john", "bob", "david" };
Je veux échanger deux de ces éléments (sans std :: swap ) en écrivant simplement
swapPointers (nm [0], nm [1]);
swapPointers ressemble à ceci

void swapPointers(char *&a, char *&b)  
{  
    char *temp = a;  
    a = b;  
    b = a;  
}

Cependant, cela ne compile pas (et bien que l’ajout de castes la rende compilée, les pointeurs finissent par pointer vers des emplacements incorrects / bizarres).

Quelqu'un peut-il aider?
Merci!

Était-ce utile?

La solution

Zan est proche, mais son problème est que sa fonction "swap" peut prendre n’importe quel pointeur sur des caractères. Cela peut causer des problèmes si mal utilisé. Voici une version plus sûre:

void swap(char (&x)[MAX2], char (&y)[MAX2])
{
    char temp[MAX2];

    memcpy(temp, x, MAX2);
    memcpy(x, y, MAX2);
    memcpy(y, temp, MAX2);
}

Il y a également un malentendu de la part de l'affiche: "nm" est un tableau de caractères à 2 dimensions. Il n'y a pas d'indicateurs. nm [0], nm [2], etc ... ne sont pas non plus des pointeurs, ils sont toujours des tableaux (à une dimension). Le fait que les tableaux à une dimension soient implicitement convertibles en pointeurs provoque ce type de confusion parmi de nombreux programmeurs C et C ++.

Pour échanger les données dans le tableau à 2 dimensions, vous devez échanger des blocs de mémoire de taille MAX2 - comme indiqué par les deux fonctions "d'échange" que Zan et moi avons écrites.

Autres conseils

Vous ne pouvez pas échanger ces pointeurs en les réaffectant, car ces pointeurs pointent dans un tableau de caractères 2D.

nm [a] et nm [b] sont très fortement const car nm est vraiment un objet const . Si ce n'était pas le cas, vous pouvez déplacer les variables C dans la RAM en réaffectant leurs noms.

Pensez simplement aux ravages! Donc, vous ne pouvez pas faire ça. : -)

Pour permuter ce que pointent ces pointeurs, vous devez permuter les valeurs de ces emplacements de tableau.

swap(char *a, char *b)
{
  char temp[MAX1];
  memcpy(temp, a, MAX1);
  memcpy(b, a, MAX1);
  memcpy(a, temp, MAX1);
}

Votre swapPointers () permute les pointeurs, alors que vous essayez de passer des tableaux.

Si vous changez

char nm[MAX1][MAX2]

à

char *nm[MAX1]

et corrigez le petit bogue dans swapPointers () (la dernière ligne devrait être b = temp; ), cela fonctionne.

Le vrai problème est que si vous utilisez c ++, vous devriez plutôt utiliser std :: vector de std :: string:

std::vector<std::string> nm;
nm.push_back( "john" );
nm.push_back( "bob" );
nm.push_back( "david" );
std::swap( nm[0], nm[1] );

Remarque: non testé.

void swapPointers(char** ppa, char** ppb)
{
    char* ptemp = *ppa;
    *ppb = *ppa;
    *ppa = ptemp;
}

swapPointers(&nm[0], &nm[1]);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top