Buenas, lo primero de todo si puedes poner el código anterior entre etiquetas de código GeSHi (encima del cuadro de texto hay un desplegable que pone "Código GeSHi" donde puede seleccionar el lenguaje de programación correspondiente).
Tu problema no está en la línea que has comentado, esa sentencia es correcta. El problema lo tiene <cadenados>, te comento.
Imaginemos la memoria como cajitas, en cada una cabe un valor. Por ejemplo:
char x = 'a'; // seria una cajita que guarda el contenido de <x> o sea, la 'a'.
Un array/arreglo son un conjunto de cajitas; en las que en cada una de ellas, se guarda un valor, por ejemplo:
char arregloDeChar[SIZE]; //serian un numero de cajitas igual al valor SIZE y en cada una cabe un <char>
Muchas veces se confunde un array con un puntero, pero un puntero únicamente es una cajita que en vez de guardar un dato directamente, guarda la dirección de memoria de otro dato, por ejemplo:
char x = 'a'; // supongamos que la direccion de x es 0x1 entonces en la posicion de memoria 0x1 se almacena 'a' (dicho de forma simple)
char *px = &x; // aqui creamos otra cajita para px que almacena la direccion de x. Imaginemos que px se encuentra en 0x2, entonces en 0x2 se guarda 0x1.
La confusión entre punteros y arrays se debe a lo siguiente:
char array[10] = {'a', 'b', 'c'};
// array[0] es un dato de tipo char, array[0] = 'a'
// array[1] es un dato de tipo char, array[1] = 'b'
// array[2] es un dato de tipo char, array[2] = 'c'
// array es un puntero a array[0]
Entonces cuando se trabaja con memoria dinámica (cosa que si estás empezando dudo que conozcas) lo que se hace es declarar un puntero y luego a ese puntero se le reserva memoria para que pase de tener 1 cajita de memoria a tener más. Si trabajas con memoria dinámica lo que debes usar son arrays estáticos, es decir, con los corchetes como he hecho yo arriba.
Aquí es donde aparece tu problema. Estás guardando una cadena mediante la función <gets()> (la cual te recomiendo que cambies por <fgets()>, no se recomienda usar <gets()> porque es menos segura) al puntero <cadenados>, pero <cadenados> solo tiene 1 cajita para un caracter.
Y puede que te preguntes "por qué con <cadenados> tengo ese problema y con <cadenauno> y <cadenatres> no?"
Verás, al poner por ejemplo:
char *cadenauno = "hola";
Lo que sucede es que al cargar el programa en memoria para ser ejecutado hay un "array" (entiéndase así) en el que el programa tiene guardado "hola" para poder asignarlo a <cadenauno>. Como ese "hola" ya está guardado en una posición de memoria, el programa lo único que hace es guardar en <cadenauno> la dirección de memoria en la que está guardado "hola" (la dirección en la que comienza "hola").
Es por esto que <cadenauno> y <cadenatres> no dan problemas. Porque la cadena de caracteres "hola" ya existe en memoria. Sin embargo, <cadenados> como la introduce el usuario por teclado, no existe en memoria antes del tiempo de ejecución.
Solución: Declarar un array. Y si luego quieres usar otro puntero pues lo creas y haces que apunte al comienzo del array.
#define SIZE 100 // longitud suficiente para que quepa lo que queremos guardar
char cadena2Array[SIZE];
printf("Introduce el valor de cadena2: "); fgets(cadena2Array
, SIZE
, stdin
); // mas seguro que gets() porque se asegura de no pasarse del limite SIZE printf("El valor de cadena2Array es: %s", cadena2Array
);
// si quieres otro puntero
char *cadena2Puntero = cadena2Array;
printf("El valor de cadena2Puntero es: %s", cadena2Puntero
); // Misma salida ya que apunta al mismo sitio
Te dejo
AQUÍ un enlace a otro tema reciente en el que se tratan también estos temas y tienen algunas explicaciones más completas.
Espero que te sirva.
Suerte