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);
}
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
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.
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
// Se saca la primera palabra de origen
palabra
= strtok(copia
, delimitadores
);
// Se genera espacio para guardar un elemento en la lista
// Se genera espacio para guardar la primera palabra...
// y se guarda
// 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); ++i;
}
// Se libera la variable 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.
// Se libera la 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)
liberar_lista(&ss);
}