Intercambio transparente de punteros a matrices de caracteres en C++
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!
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]);