elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Mi programa crashea al usar Strtok
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Mi programa crashea al usar Strtok  (Leído 3,943 veces)
Lunethlion

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Mi programa crashea al usar Strtok
« en: 18 Mayo 2016, 18:52 pm »

Buenas tardes, soy nuevo en el foro así que me disculpo por adelantado debido a cualquier error en la redacción de este, y además soy estudiante novato de C++, de modo que lamento mi ignorancia.

El tema es, en concreto estoy realizando un programa cuyo funcionamiento gira en torno a un prompt al cual se le proporcionan instrucciones que el programa reconocerá y en consecuencia ejecutará una determinada función. Utilizo gets para que se le introduzca por teclado la información necesaria, y strtok para dividirla en tokens que puedan ser procesados. Por ejemplo, para realizar una prueba, si le introduzco el comando "prueba" imprimirá: "Prueba 1 completada"; y si se le proporciona "prueba 2" la respuesta será además de la primera, "Prueba 2 completada".

El problema reside en el caso en el que se le introduzca un solo comando reconocido en una función que pide más, crashea...

Este es mi programa:

Código:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <string.h>

using namespace std;

int i=1, a=1;
char prompt[256]="[*]:>", comando[256];
string token[12];


int main()
{
while(i==1)
    {
    a=1;
    cout << endl << prompt;
    gets(comando);
    token[a]=strtok(comando," ");

    if(token[a]=="prueba")
        {
        cout << "prueba 1 completada.\n";
        a++;
        token[a]=strtok(NULL," ");
        if(token[a]=="2"){cout << "prueba 2 completada.\n";}
        }
    }
}

El caso es, en la función prueba (o mejor dicho, la que en un futuro sería una función) "token[a]=strtok(comando," ")"; divide la cadena "comando" en tokens: y "token[a]=strtok(NULL, " ")" continúa dividiendola por el sitio donde lo dejó el anterior strtok. El problema es que cuando strtok(NULL," ") se ejecuta intentando seguir dividiendo una cadena que no existe (por ejemplo "prueba" la cual empieza y termina de dividirse en el primer strtok) hace que el programa crashee, porque la función prueba para ejecutarse requiere 2 valores: "Prueba" seguido de "2".

Como podría solucionar este problema? Hay algo que me he perdido, hecho mal o usado incorrectamente?

Muchas gracias por vuestra atención.


« Última modificación: 18 Mayo 2016, 18:57 pm por Lunethlion » En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Mi programa crashea al usar Strtok
« Respuesta #1 en: 18 Mayo 2016, 19:04 pm »

Antes de interactuar con el contenido del token tienes que evaluar que no sea NULL

Código
  1. if(token[a] != NULL){
  2. //Acciones
  3. }

Saludos!


« Última modificación: 18 Mayo 2016, 19:08 pm por AlbertoBSD » En línea

Lunethlion

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Mi programa crashea al usar Strtok
« Respuesta #2 en: 18 Mayo 2016, 19:12 pm »

Antes de interactuar con el contenido del token tienes que evaluar que no sea NULL

Código
  1. if(token[a] != NULL){
  2. //Acciones
  3. }

Saludos!

He probado a añadir tu sugerencia, pero ahora el programa no me compila...

Código:
if(token[a]=="prueba")
        {
        cout << "prueba 1 completada.\n";
        if(token[a] != NULL)
            {
            a++;
            token[a]=strtok(NULL," ");
            if(token[a]=="2"){cout << "prueba 2 completada.\n";}
            }
        }

concretamente el error es:

Citar
E:\Onedrive\Mis Programas\PFunPro.cpp|36|error: no match for 'operator!=' (operand types are 'std::string {aka std::basic_string<char>}' and 'int')|
« Última modificación: 18 Mayo 2016, 19:14 pm por Lunethlion » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Mi programa crashea al usar Strtok
« Respuesta #3 en: 18 Mayo 2016, 19:18 pm »

strtok trabaja con cadenas de caracteres (char*), no con string. El retorno, es un char*.

Veo que estás usando cabeceras de C y a la vez, C++. Las cabeceras de C++ son como las de C, pero con una 'c' al principio, y sin el ".h": <math.h> - <cmath>

Si quieres trabajar con string, puedes usar métodos de la clase striong como find() o substr(), para encontrar el índice de un caracter y para obtener una sub-cadena, respectivamente.
En línea

Lunethlion

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Mi programa crashea al usar Strtok
« Respuesta #4 en: 18 Mayo 2016, 19:30 pm »

strtok trabaja con cadenas de caracteres (char*), no con string. El retorno, es un char*.

Veo que estás usando cabeceras de C y a la vez, C++. Las cabeceras de C++ son como las de C, pero con una 'c' al principio, y sin el ".h": <math.h> - <cmath>

Si quieres trabajar con string, puedes usar métodos de la clase striong como find() o substr(), para encontrar el índice de un caracter y para obtener una sub-cadena, respectivamente.

Gracias por responder. Find me servirá de lujo para una futura función que debo implementar, pero no veo como me puede ayudar concretamente aqui. Además, quisiera aprender el funcionamiento de Strtok para segmentar cadenas de carácteres.

Añado que he probado a cambiar token de string a char*, pero ahora no funciona. Probablemente no he entendido a que te referías.
En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Mi programa crashea al usar Strtok
« Respuesta #5 en: 18 Mayo 2016, 19:58 pm »

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. int main() {
  6. int i=1, a;
  7. char *prompt="[*]:>";
  8. char comando[256];
  9. char *token[12];
  10. while(i==1) {
  11. printf("%s",prompt);
  12. fgets(comando,256,stdin);
  13. a = 0;
  14. token[a]=strtok(comando," ");
  15. a = 1;
  16. while(token[a-1] != NULL && a < 12){
  17. printf("Token: %s\n",token[a-1]);
  18. token[a]=strtok(NULL," ");
  19. a++;
  20.  
  21. }
  22. memset(token,0,sizeof(char *)*12);
  23. memset(comando,0,256);
  24. }
  25. }

Cambie un poco el codigo.

Saludos!
« Última modificación: 18 Mayo 2016, 20:01 pm por AlbertoBSD » En línea

Lunethlion

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Mi programa crashea al usar Strtok
« Respuesta #6 en: 19 Mayo 2016, 18:20 pm »

Código
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4.  
  5. int main() {
  6. int i=1, a;
  7. char *prompt="[*]:>";
  8. char comando[256];
  9. char *token[12];
  10. while(i==1) {
  11. printf("%s",prompt);
  12. fgets(comando,256,stdin);
  13. a = 0;
  14. token[a]=strtok(comando," ");
  15. a = 1;
  16. while(token[a-1] != NULL && a < 12){
  17. printf("Token: %s\n",token[a-1]);
  18. token[a]=strtok(NULL," ");
  19. a++;
  20.  
  21. }
  22. memset(token,0,sizeof(char *)*12);
  23. memset(comando,0,256);
  24. }
  25. }

Cambie un poco el codigo.

Saludos!

Siguiendo tu ejemplo, no me deja usar NULL. El compilador salta y dice...

error: no match for 'operator!=' (operand types are 'std::string {aka std::basic_string<char>}' and 'int')|"

he puesto: while(token != NULL){------}
En línea

HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Mi programa crashea al usar Strtok
« Respuesta #7 en: 19 Mayo 2016, 18:28 pm »

El codigo de AlbertoBSD compilalo con gcc (u otro compilador de C), lo estas compilando con un compilador de C++

Si usas Dev-C++ o CodeBlocks al menos que la extension del programa sea .c y no .cpp
En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: Mi programa crashea al usar Strtok
« Respuesta #8 en: 19 Mayo 2016, 19:46 pm »

Siguiendo tu ejemplo, no me deja usar NULL. El compilador salta y dice...

error: no match for 'operator!=' (operand types are 'std::string {aka std::basic_string<char>}' and 'int')|"

he puesto: while(token != NULL){------}

fijate el código y lo que estás haciendo... tu error es

Código:
error: no match for 'operator!=' (operand types are 'std::string {aka std::basic_string<char>}' and 'int')|

es decir estás comparando un string con NULL

el codigo de AlbertoBSD no compara nunca con string...

linea 16
Código:
token[a-1] != NULL && a < 12

y si vemos la decharación en la linea 9
Código:
char *token[12];

no estás haciendo nada de lo que te dicen, por eso falla... no puedes comprar string con NULL, tienes que pasar a char *, recuerda char *, no string... (y por dejarlo claro) string no se puede comprar con NULL, es char *

luego de char* si puedes pasar a string, pero no antes
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Programa crashea al escribir
Ingeniería Inversa
x64core 0 1,996 Último mensaje 23 Septiembre 2012, 02:07 am
por x64core
Me crashea el programa « 1 2 »
Programación C/C++
jaxoR 16 7,324 Último mensaje 14 Marzo 2014, 07:02 am
por leosansan
Me crashea el programa
Programación C/C++
jaxoR 2 2,424 Último mensaje 30 Mayo 2014, 02:42 am
por Yoel Alejandro
¿Comó usar strtok con listas de la biblioteca <vector>?
Programación C/C++
oriana_anairo 2 2,506 Último mensaje 16 Septiembre 2016, 14:41 pm
por ivancea96
Por qué mi programa crashea?
Programación C/C++
poliche 2 2,359 Último mensaje 11 Octubre 2016, 23:16 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines