ayuda con un codigo

Iniciado por MRx86, 22 Enero 2017, 22:22 PM

0 Miembros y 1 Visitante están viendo este tema.

MRx86

hola, estaba haciendo el siguiente programa:



#include  <stdio.h>
#include <stdlib.h>
#include <string.h>

#define STRMAXLEN 256

int convert (char **buffer, const char *src);
int wordsof (const char *src);
int nextstrinstr (const char *str, char *buffer, int *pos);

int convert (char **buffer , const char *src)
{
int words = wordsof (src);
unsigned int i;
int strpos = 0;
char strbuff[STRMAXLEN];


buffer = (char **) malloc (sizeof (char *) * words);

for (i = 0; i < words; i++)
{
nextstrinstr (src, strbuff, &strpos);
strcpy (buffer[i], strbuff);
}

return words;
}

int wordsof (const char *src)
{
unsigned int i, num = 0;

for (i = 0; i < strlen (src); i++)
if (src [i] == ' ') num++;

++num;

return num;
}

int nextstrinstr (const char *str, char *buffer, int *pos)
{
//iterador sobre la cadena str
unsigned int i = *pos;

//iterador sobre la cadena buffer
int j = 0;

for (i, j; str [i] != ' '; i++, j++)
{
buffer [j] = str [i];
}

buffer [j] = '\0';

++i;

*pos = i;
return j;
}

int main ()
{
const char *s = "cadena_uno cadena_dos cadena_tres cadena_cuatro cadena_cinco";
char **ss;

convert (ss, s);
}



y bueno esto es lo que hace (al menos lo que deberia hacer):

simplemente convierte de un puntero a una cadena de caracteres, a un puntero a punteros a cadenas de caracteres (casi como el metodo split de python, la diferencia es que el de python si funciona correctamente jaja..).

lo que deberia hacer es que desde la cadena



const char *s = "cadena_uno cadena_dos cadena_tres cadena_cuatro cadena_cinco";



genere la cadena

Código (cpp) [Seleccionar]


char **ss = {"cadena_uno",
                    "cadena_dos",
                    "cadena_tres",
                    "cadena_cuatro ",
                    "cadena_cinco"
                    };



pero me lanza el codigo de error 255 (lo busque en google y no aparece nada, aparecen cosas que no son)

espero que me puedan ayudar...

pd: el compilador es dev-c++ y el OS es Windows 10.

Saludos.
"Tengo una pregunta que a veces me tortura: ¿Estoy loco
yo, o los locos son los demas?"
- Albert Einstein

MAFUS

#1
A ver si te sirve esto. Está en C, compila en GCC.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void crear_lista(char ***lista, const char *origen) {
   char *palabra;
   char **l;
   char *delimitadores = " \t";
   char *copia;
   unsigned i = 0;
   
   // Guarda para saber si origen está vacío.
   if(origen == NULL) {
       *lista = NULL;
        return;
   }
   
   // Una copia no constante de origen para strtok
   copia = malloc((strlen(origen) + 1) * sizeof(char));
   strcpy(copia, origen);
   
   // Se saca la primera palabra de origen
   palabra = strtok(copia, delimitadores);
   
   // Se genera espacio para guardar un elemento en la lista
   l = malloc(sizeof(char *));
   
   // Se genera espacio para guardar la primera palabra...
   l[i] = malloc((strlen(palabra)+1) * sizeof(char));
   // y se guarda
   strcpy(l[i], palabra);
   
   // Se avanza el puntero de la lista en una posición
   ++i;
   
   // Mientras queden palabas en origen
   while((palabra = strtok(NULL, delimitadores))) {
       // Se repiten los pasos anteriores. El uso de realloc
       // es por que se redimensiona la lista.
       l = realloc(l, sizeof(char *) * i+1);
       l[i] = malloc((strlen(palabra)+1) * sizeof(char));
       strcpy(l[i], palabra);
       ++i;
   }
   
   // Se libera la variable copia.
   free(copia);
   
   // Para terminar una última redimensión...
   l = realloc(l, sizeof(char *) * i+1);
   // para alojar el valor nulo que marca el fin de la lista.
   l[i] = NULL;
   
   // Se guarda la lista en la variable del parámetro de la función.
   *lista = l;
}
   
void liberar_lista(char ***lista) {
   int i;
   
   // Si no hay nada que liberar regresa.
   if(!*lista) return;
   
   // Por cada elemento en la lista...
   for(i = 0; lista[i]; ++i)
       // liberar esa posición.
       free((*lista)[i]);
   
   // Se libera la lista.
   free(*lista);
   
   // Se marca nula la lista en la variable
   // del parámetro de la función y así indicar
   // que dicha variable está libre para usarse
   // de nuevo.
   *lista = NULL;
}

int main() {
   const char *s = "cadena_uno cadena_dos cadena_tres cadena_cuatro cadena_cinco";
   char **ss;
   int i;
   
   crear_lista(&ss, s);
   
   for(i = 0; ss[i]; ++i)
       printf("%s\n", ss[i]);
       
   liberar_lista(&ss);
}