Frage

Ich habe ein 2D-Zeichenfeld:
char nm[MAX1][MAX2] = { "john", "bob", "david" };
Ich möchte zwei dieser Elemente tauschen (ohne std::swap) durch einfaches Schreiben
swapPointers(nm[0], nm[1]);
wo swapPointers wie folgt aussieht

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

Dies ist jedoch nicht kompiliert (und beim Hinzufügen von Abgüssen kompilieren macht, enden die Zeiger auf falsch / seltsame Stellen nach oben).

Kann jemand helfen?
Dank!

War es hilfreich?

Lösung

Zan ist in der Nähe, aber sein Problem ist, dass sein ‚Swap‘ -Funktion alle Zeiger auf Zeichen nehmen. Dies kann zu Problemen führen, wenn missbraucht. Hier ist eine sicherere Version:

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

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

Es gibt auch ein Missverständnis seitens des Plakats: ‚nm‘ ist ein 2-dimensionales Array von Zeichen. Es gibt keine Zeiger. nm [0], nm [2], etc ... sind auch keine Zeiger entweder - sie sind noch (1-dimensional) Arrays. Die Tatsache, dass 1-dimensionalen Arrays Zeiger implizit konvertierbar sind die Ursachen dieser Art von Verwirrung bei vielen C und C ++ Programmierer.

Um die Daten in dem 2-dimensionalen Array zu tauschen, müssen Sie Speicherblocks der Größe MAX2 tauschen - wie Zan von beiden ‚Swap‘ Funktionen angezeigt und ich schrieb

.

Andere Tipps

Sie können nicht diese Zeiger tauschen durch den Zeiger Zu, weil diese Zeiger in einen 2-D-Zeichen-Array zeigen.

nm [a] und nm [b] sind sehr stark const weil nm ein wirklich const Objekt ist. Wenn es nicht ist, konnte man C-Variablen um in RAM verschieben, indem ihre Namen Zu.

Man denke nur an das Chaos! So kann man das nicht. : -)

So tauschen, was die Zeiger zeigen auf, müssen Sie die Werte in diesen Feldpositionen tauschen.

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

Ihre swapPointers() Swaps Zeiger, während Sie versuchen, es Arrays zu übergeben.

Wenn Sie ändern

char nm[MAX1][MAX2]

char *nm[MAX1]

und fixieren Sie die kleinen Fehler in swapPointers() (letzte Zeile sollte b = temp; sein), es funktioniert.

Der eigentliche Punkt ist, wenn Sie c ++ verwenden, dann sollten Sie eine std :: vector von std verwenden :: string statt:

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

. Hinweis: nicht getestet

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

swapPointers(&nm[0], &nm[1]);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top