Pregunta

Tengo una matriz de caracteres 2D:
char nm[MAX1][MAX2] = { "john", "bob", "david" };
Quiero intercambiar dos de estos elementos (sin std::swap) simplemente escribiendo
swapPointers(nm[0], nm[1]);
dónde swapPointers Se ve como esto

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

Sin embargo, esto no se compila (y aunque agregar conversiones hace que se compile, los punteros terminan apuntando a ubicaciones incorrectas/extrañas).

¿Alguien puede ayudar?
¡Gracias!

¿Fue útil?

Solución

Zan está cerca, pero su problema es que su función de 'intercambio' puede tomar cualquier puntero a personajes.Esto puede causar problemas si se usa incorrectamente.Aquí hay una versión más segura:

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

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

También hay un malentendido por parte del cartel:'nm' es una matriz bidimensional de caracteres.No hay indicaciones.nm[0], nm[2], etc...Tampoco son punteros: siguen siendo matrices (unidimensionales).El hecho de que las matrices unidimensionales sean implícitamente convertibles en punteros provoca este tipo de confusión entre muchos programadores de C y C++.

Para intercambiar los datos en la matriz bidimensional, debe intercambiar bloques de memoria de tamaño MAX2, como lo indican las funciones de 'intercambio' que escribimos Zan y yo.

Otros consejos

No puede intercambiar esos punteros reasignándolos, porque esos punteros apuntan a una matriz de caracteres 2-D.

nm[a] y nm[b] son ​​muy fuertes const porque nm es verdaderamente const objeto.Si no fuera así, podría mover las variables C en la RAM reasignando sus nombres.

¡Solo piensa en los estragos!Entonces no puedes hacer eso.:-)

Para intercambiar lo que apuntan esos punteros, debe intercambiar los valores en esas ubicaciones de la matriz.

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

Su swapPointers() intercambia punteros, mientras que usted intenta pasarle matrices.

si cambias

char nm[MAX1][MAX2]

a

char *nm[MAX1]

y arreglar el pequeño error en swapPointers() (la última línea debe ser b = temp;), funciona.

El verdadero punto es que, si estás usando c++, entonces deberías usar un std::vector de std::string en su lugar:

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

Nota:no probado.

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

swapPointers(&nm[0], &nm[1]);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top