Ese programa tiene varios errores. Lo primero es evitar el uso de la función "gets", mas información en el tema
|Lo que no hay que hacer en C/C++. Nivel basico|.
Si apenas empiezas con el tema de punteros deberías conseguir un buen libro sobre el tema, uno muy bueno pero en ingles y algo caro es:
Pointers on C, 1st edition
Kenneth Reek
Addison Wesley
ISBN: 0673999866
Es un libro enfocado en C estándar (C90) con especial énfasis en el tema de manejo de direcciones de memoria (punteros). Comparado con K&R2 lo bueno es que tiene explicaciones mas detalladas (incluyendo gráficas), lo malo es que su selección de ejemplos no es tan buena como el mencionado.
El primer error importante es utilizar la variable "orden" sin darle un valor antes. Debido a que su valor inicial (a falta de uno) es no definido o "basura" no lo puedes utilizar (debes utilizar antes malloc o bien cambiar su uso por un array).
También hay que utilizar nombres claros y
descriptivos, por ejemplo para encontrar el uso (y diferencias) entre "aux" y "aux1" hay que revisar en detalle el programa. Mejor acostúmbrate desde ahora.
Tampoco puedes utilizar esto:
Porque los objetos "aux[N]" son de tipo "char **" mientras que printf espera un "char *".
Si entiendo correctamente buscas obtener las direcciones de cada una de las palabras. Para ello hay varias formas como utilizar strcspn + strspn, sscanf, etc.
Un ejemplo utilizando el par strcspn + strspn:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char linea[] = " Esta es la cadena de prueba ";
char *palabra[100]; /* O algun valor apropiado */
int longitud[100]; /* O algun valor apropiado */
int num_palabras;
char *p;
int i;
p = linea;
num_palabras = 0;
while (p[i] != '\0'){
/* Almacenamos la direccion de la palabra */
p += i;
palabra[num_palabras] = p;
/* Obtenemos su longitud */
longitud
[num_palabras
] = strcspn(p
, " ");
/* Actualizamos los contadores */
p += longitud[num_palabras];
num_palabras++;
/* Pasamos a la siguiente ... */
}
for (i = 0; i < num_palabras; i++)
printf("palabra[%d] == \"%.*s\"\n", i
, longitud
[i
], palabra
[i
]);
return EXIT_SUCCESS;
}
----
Edito:
Otra opción es mediante la función sscanf utilizando el especificador "%n" el cual nos da el numero de caracteres coincidentes hasta el momento:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char linea[] = " Esta es la cadena de prueba ";
char *palabra[100]; /* O algun valor apropiado */
int longitud[100]; /* O algun valor apropiado */
int num_palabras;
int i;
char *p;
char aux[100];
int num_chars;
int num_spc;
p = linea;
num_palabras = 0;
while (sscanf(p
, " %n%s%n", &num_spc
, aux
, &num_chars
) == 1){ /* Almacenamos la direccion de la palabra */
palabra[num_palabras] = p + num_spc;
longitud[num_palabras] = num_chars - num_spc;
num_palabras++;
/* Pasamos a la siguiente ... */
p += num_chars;
}
for (i = 0; i < num_palabras; i++)
printf("palabra[%d] == \"%.*s\"\n", i
, longitud
[i
], palabra
[i
]);
return EXIT_SUCCESS;
}
Un detalle: funciona correctamente con GCC 3.x pero, por alguna extraña razón, no da los resultados correctos con Lcc-Win32 (debería darlos ya que hasta donde revise la documentación el comportamiento debe ser el esperado).
Un saludo