Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: MRx86 en 22 Enero 2017, 22:22 pm



Título: ayuda con un codigo
Publicado por: MRx86 en 22 Enero 2017, 22:22 pm
hola, estaba haciendo el siguiente programa:

Código
  1.  
  2. #include  <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. #define STRMAXLEN 256
  7.  
  8. int convert (char **buffer, const char *src);
  9. int wordsof (const char *src);
  10. int nextstrinstr (const char *str, char *buffer, int *pos);
  11.  
  12. int convert (char **buffer , const char *src)
  13. {
  14. int words = wordsof (src);
  15. unsigned int i;
  16. int strpos = 0;
  17. char strbuff[STRMAXLEN];
  18.  
  19.  
  20. buffer = (char **) malloc (sizeof (char *) * words);
  21.  
  22. for (i = 0; i < words; i++)
  23. {
  24. nextstrinstr (src, strbuff, &strpos);
  25. strcpy (buffer[i], strbuff);
  26. }
  27.  
  28. return words;
  29. }
  30.  
  31. int wordsof (const char *src)
  32. {
  33. unsigned int i, num = 0;
  34.  
  35. for (i = 0; i < strlen (src); i++)
  36. if (src [i] == ' ') num++;
  37.  
  38. ++num;
  39.  
  40. return num;
  41. }
  42.  
  43. int nextstrinstr (const char *str, char *buffer, int *pos)
  44. {
  45. //iterador sobre la cadena str
  46. unsigned int i = *pos;
  47.  
  48. //iterador sobre la cadena buffer
  49. int j = 0;
  50.  
  51. for (i, j; str [i] != ' '; i++, j++)
  52. {
  53. buffer [j] = str [i];
  54. }
  55.  
  56. buffer [j] = '\0';
  57.  
  58. ++i;
  59.  
  60. *pos = i;
  61. return j;
  62. }
  63.  
  64. int main ()
  65. {
  66. const char *s = "cadena_uno cadena_dos cadena_tres cadena_cuatro cadena_cinco";
  67. char **ss;
  68.  
  69. convert (ss, s);
  70. }
  71.  
  72.  

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

Código
  1.  
  2. const char *s = "cadena_uno cadena_dos cadena_tres cadena_cuatro cadena_cinco";
  3.  
  4.  

genere la cadena

Código
  1.  
  2. char **ss = {"cadena_uno",
  3.                    "cadena_dos",
  4.                    "cadena_tres",
  5.                    "cadena_cuatro ",
  6.                    "cadena_cinco"
  7.                    };
  8.  
  9.  

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.


Título: Re: ayuda con un codigo
Publicado por: MAFUS en 24 Enero 2017, 00:22 am
A ver si te sirve esto. Está en C, compila en GCC.
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. void crear_lista(char ***lista, const char *origen) {
  6.    char *palabra;
  7.    char **l;
  8.    char *delimitadores = " \t";
  9.    char *copia;
  10.    unsigned i = 0;
  11.  
  12.    // Guarda para saber si origen está vacío.
  13.    if(origen == NULL) {
  14.        *lista = NULL;
  15.        return;
  16.    }
  17.  
  18.    // Una copia no constante de origen para strtok
  19.    copia = malloc((strlen(origen) + 1) * sizeof(char));
  20.    strcpy(copia, origen);
  21.  
  22.    // Se saca la primera palabra de origen
  23.    palabra = strtok(copia, delimitadores);
  24.  
  25.    // Se genera espacio para guardar un elemento en la lista
  26.    l = malloc(sizeof(char *));
  27.  
  28.    // Se genera espacio para guardar la primera palabra...
  29.    l[i] = malloc((strlen(palabra)+1) * sizeof(char));
  30.    // y se guarda
  31.    strcpy(l[i], palabra);
  32.  
  33.    // Se avanza el puntero de la lista en una posición
  34.    ++i;
  35.  
  36.    // Mientras queden palabas en origen
  37.    while((palabra = strtok(NULL, delimitadores))) {
  38.        // Se repiten los pasos anteriores. El uso de realloc
  39.        // es por que se redimensiona la lista.
  40.        l = realloc(l, sizeof(char *) * i+1);
  41.        l[i] = malloc((strlen(palabra)+1) * sizeof(char));
  42.        strcpy(l[i], palabra);
  43.        ++i;
  44.    }
  45.  
  46.    // Se libera la variable copia.
  47.    free(copia);
  48.  
  49.    // Para terminar una última redimensión...
  50.    l = realloc(l, sizeof(char *) * i+1);
  51.    // para alojar el valor nulo que marca el fin de la lista.
  52.    l[i] = NULL;
  53.  
  54.    // Se guarda la lista en la variable del parámetro de la función.
  55.    *lista = l;
  56. }
  57.  
  58. void liberar_lista(char ***lista) {
  59.    int i;
  60.  
  61.    // Si no hay nada que liberar regresa.
  62.    if(!*lista) return;
  63.  
  64.    // Por cada elemento en la lista...
  65.    for(i = 0; lista[i]; ++i)
  66.        // liberar esa posición.
  67.        free((*lista)[i]);
  68.  
  69.    // Se libera la lista.
  70.    free(*lista);
  71.  
  72.    // Se marca nula la lista en la variable
  73.    // del parámetro de la función y así indicar
  74.    // que dicha variable está libre para usarse
  75.    // de nuevo.
  76.    *lista = NULL;
  77. }
  78.  
  79. int main() {
  80.    const char *s = "cadena_uno cadena_dos cadena_tres cadena_cuatro cadena_cinco";
  81.    char **ss;
  82.    int i;
  83.  
  84.    crear_lista(&ss, s);
  85.  
  86.    for(i = 0; ss[i]; ++i)
  87.        printf("%s\n", ss[i]);
  88.  
  89.    liberar_lista(&ss);
  90. }