Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: huchoko en 13 Febrero 2019, 18:03 pm



Título: [C]Como puedo parsear un simple comando
Publicado por: huchoko en 13 Febrero 2019, 18:03 pm
Estoy escribiendo una consola en C, pues debo recibir comandos (por el teclado) y parsearlos.
E.j: tengo este comando:
Código:
echo hola! -f
Pues nececitaria separar esas strings algo asi:
Código:
["echo", "hola!", "-f"]
Osea separarlas en diferentes strings y guardarlas en un array.
Como lo podria hacer?
Saludos


Título: Re: [C]Como puedo parsear un simple comando
Publicado por: ThunderCls en 13 Febrero 2019, 18:26 pm
Tu funcion se llama strtok
https://en.cppreference.com/w/c/string/byte/strtok


Título: Re: [C]Como puedo parsear un simple comando
Publicado por: huchoko en 13 Febrero 2019, 19:00 pm
Gracias! :)


Título: Re: [C]Como puedo parsear un simple comando
Publicado por: huchoko en 13 Febrero 2019, 19:20 pm
Código
  1. char* cmdparser(char* fstrlv1, char* s, int len)
  2. {
  3.    char* fstrlv[len];
  4.    char *tok = s;
  5.    int i = 0;
  6.  
  7.    while ((tok = strtok(tok, " ")) != NULL)
  8.    {
  9.        fstrlv[++i] = tok;
  10.        tok = NULL;
  11.    }
  12.    fstrlv[i] = '\0';
  13.    return fstrlv;
  14. }
  15.  
He tratado de escribir esta función que debería retornarme el array con los strings separados, pero no funciona...
Algo me dice que mi código es horrible...


Título: Re: [C]Como puedo parsear un simple comando
Publicado por: CalgaryCorpus en 13 Febrero 2019, 19:25 pm
El ++i no deberia ser i++?


Título: Re: [C]Como puedo parsear un simple comando
Publicado por: huchoko en 13 Febrero 2019, 19:42 pm
Tampoco funciona :/


Título: Re: [C]Como puedo parsear un simple comando
Publicado por: ThunderCls en 13 Febrero 2019, 20:02 pm
EDIT: Disculpa no habia chequeado tu code  :silbar: en fin

Código
  1. #include <iostream>
  2. #include <cstring>
  3. #include <vector>
  4.  
  5. std::vector<char*> cmdparser(char* str, const char *delim)
  6. {
  7.    std::vector<char*> str_array;
  8.    char *token = strtok(str, delim);
  9.    while (token)
  10.    {
  11.        str_array.push_back(token);
  12.        token = strtok(NULL, delim);
  13.    }
  14.  
  15.    return str_array;
  16. }
  17.  
  18. int main()
  19. {
  20.    char str[] = "-param_1 -param_2 -param_3 -param_n";
  21.    char delim[] = " ";
  22.    for(auto s : cmdparser(str, delim))
  23.        cout << s << endl;
  24.  
  25.    return 0;
  26. }

Salida
-param_1
-param_2
-param_3
-param_n


Saludos


Título: Re: [C]Como puedo parsear un simple comando
Publicado por: huchoko en 13 Febrero 2019, 21:02 pm
EDIT: Disculpa no habia chequeado tu code  :silbar: en fin

Código
  1. #include <iostream>
  2. #include <cstring>
  3. #include <vector>
  4.  
  5. std::vector<char*> cmdparser(char* str, const char *delim)
  6. {
  7.    std::vector<char*> str_array;
  8.    char *token = strtok(str, delim);
  9.    while (token)
  10.    {
  11.        str_array.push_back(token);
  12.        token = strtok(NULL, delim);
  13.    }
  14.  
  15.    return str_array;
  16. }
  17.  
  18. int main()
  19. {
  20.    char str[] = "-param_1 -param_2 -param_3 -param_n";
  21.    char delim[] = " ";
  22.    for(auto s : cmdparser(str, delim))
  23.        cout << s << endl;
  24.  
  25.    return 0;
  26. }

Salida
-param_1
-param_2
-param_3
-param_n


Saludos
Gracias, pero lo nececito en C. No es por ser mal agradecido :)
Tratare de portearlo a C.


Título: Re: [C]Como puedo parsear un simple comando
Publicado por: huchoko en 13 Febrero 2019, 21:18 pm
Código
  1. char* cmdparser(char* str, const char *delim)
  2. {
  3.    char* str_array;
  4.    char *token = strtok(str, delim);
  5.    int i = 0;
  6.    while (token)
  7.    {
  8.        str_array[i++] = token;
  9.        token = strtok(NULL, delim);
  10.    }
  11.  
  12.    return str_array;
  13. }
Logre portear el codigo, pero no funciona, otra vez  :huh:


Título: Re: [C]Como puedo parsear un simple comando
Publicado por: ThunderCls en 13 Febrero 2019, 22:48 pm
Gracias, pero lo nececito en C. No es por ser mal agradecido :)
Tratare de portearlo a C.

Igual no tengo nada mejor que hacer ahora mismo  :silbar:

Código
  1. char** cmdparser(char* str, const char* delim, int args)
  2. {
  3.    char** str_array = (char**)malloc(sizeof(char*) * args);
  4.    char* token = strtok(str, delim);
  5.    int index = 0;
  6.    while (token && index < args)
  7.    {
  8.        str_array[index] = (char*)malloc(sizeof(char) * strlen(token));
  9.        strcpy(str_array[index], token);
  10.        token = strtok(NULL, delim);
  11.        index++;
  12.    }
  13.  
  14.    return str_array;
  15. }
  16.  
  17. int main()
  18. {
  19.    char str[] = "-param_1 -param_2 -param_3 -param_n";
  20.    char delim[] = " ";
  21.    int args = 4;
  22.    char** str_array = cmdparser(str, delim, args);
  23.  
  24.    for(int i = 0; i < args; i++)
  25.        cout << str_array[i] << endl;
  26.  
  27.    // es tu responsabilidad
  28.    // liberar la memoria que pediste anteriormente
  29.    for(int i = 0; i < args; i++)
  30.        free(str_array[i]);
  31.    free(str_array);
  32.  
  33.    return 0;
  34. }