Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: prometheus48 en 17 Mayo 2012, 18:03 PM

Título: Separar string Ayuda
Publicado por: prometheus48 en 17 Mayo 2012, 18:03 PM
Hola,

Pues eso, en mi programa quiero separar el string que utilizo como entrada del usuario,por ejemplo el usuario escribe: "di hola", y despues separo el string en "di" y "hola", aunque mejor sería que fuera una función en la que puedes elegir el separador, como:
separa(entrada,".") o separa(entrada,"a")

Gracias y Saludos.

Prometheus.
Título: Re: Separar string Ayuda
Publicado por: satu en 17 Mayo 2012, 19:36 PM
Hola

Para eso puedes usar la función strtok (http://www.cplusplus.com/reference/clibrary/cstring/strtok/)

Saludos
Título: Re: Separar string Ayuda
Publicado por: prometheus48 en 17 Mayo 2012, 19:51 PM
No funciona:

Dice: strtok was not declared in this scope.
Título: Re: Separar string Ayuda
Publicado por: exel en 17 Mayo 2012, 20:13 PM
Observa:
http://c.conclase.net/librerias/?ansifun=strtok
Título: Re: Separar string Ayuda
Publicado por: satu en 17 Mayo 2012, 20:15 PM
Hola

Tienes que incluir string.h si estás en C o cstring si estás en C++

Saludos
Título: Re: Separar string Ayuda
Publicado por: prometheus48 en 17 Mayo 2012, 20:39 PM
Mejor os dejo el código:


#include <iostream>
#include <string>

using namespace std;

int main()
{
    char inp[20];
    char *pch;
    cout<<"Prueba:\n";
    bool running = true;
    while(running)
    {
        cout<<">>>";
        cin.getline(inp,5);
        pch = strtok(inp,".");
    }
    return 0;
}


Salida del compilador:
C:\Users\Samuel\Documents\Programming\C++\Chocolate\main.cpp||In function 'int main()':|
C:\Users\Samuel\Documents\Programming\C++\Chocolate\main.cpp|16|error: 'strtok' was not declared in this scope|
||=== Build finished: 1 errors, 0 warnings ===|
Título: Re: Separar string Ayuda
Publicado por: RyogiShiki en 17 Mayo 2012, 21:10 PM
Eso es porque strok pertenece a cstring.

Código (cpp) [Seleccionar]
#include <cstring>
Ya lo habia mencionado satu, no string, cstring o string.h aunque esta última pues no hace parte de la librería standard de C++
Saludos
Título: Re: Separar string Ayuda
Publicado por: prometheus48 en 17 Mayo 2012, 22:15 PM
Bueno las función strtok() no me gusta, osea, algo como esto:

vector<string> split()
{
    // La función.
}

vector<string> inp;

int main()
{
string inp = "mov.ax.4";
split(inp,"."); //Guarda en inp[0] "mov" en inp[1] "ax" y en inp [2] "4"
}


No he podido usar strtok correctamente de todas formas.

Gracias Igualmente.

Saludos!
Título: Re: Separar string Ayuda
Publicado por: RyogiShiki en 18 Mayo 2012, 01:08 AM
si lo quieres hacer con vectore, pues bueno aqui te dejo un ejemplo que acabo de hacer:

Código (cpp) [Seleccionar]

vector<string> split(string str, char token) {
   vector<string> res;
   string tmp;
   for ( unsigned int i = 0; i <= str.length(); i++ ) {
       if ( str[i]  == token || i == str.length() ) {
           if ( str[i + 1] == token ) continue;
           res.push_back(tmp);
           tmp.erase();
           i++;
       }
       tmp += str[i];
   }
   return res;
}


Espero te pueda servir de guia.

He intentado simular lo mejor posible el comportamiento del método split() en Ruby.

Saludos
Título: Re: Separar string Ayuda
Publicado por: durasno en 18 Mayo 2012, 04:08 AM
Hola! no pudist usar strtok porque no lo estas usando bien. Aparte de leer el link q te mando exel http://c.conclase.net/librerias/?ansifun=strtok falta agregar algo mas(q el link no lo dice pero si lo muestra en el ejemplo): cuando se llama por primera ves a strtok, en el primer argumento se pone la cadena q se va a separar en tokens. PERO cuando se llama x segunda vez(y posteriores) en el primer argumento hay q poner NULL

#include <iostream>
#include <string>

using namespace std;

int main()
{
   char inp[20];
   char *pch;
   cout<<"Prueba:\n";
   cin.getline(inp,5); // ingreso de cadena
   pch=strtok(inp,"."); /* Primera llamada -> primer token -> primer argumento la cadena a separar*/
   printf("%s\n",pch); // imprime el primer token
   while((pch = strtok(NULL,"."))!=NULL) /* Segunda llamada y posteriores, en el primer argumento va NULL */
   {
       printf("%s\n",pch); // imprime los tokens posteriores
   }
   return 0;
}


Puse los printf xq no tengo idea de como funciona el cout :P (no se C++)

Saludos
Título: Re: Separar string Ayuda
Publicado por: RyogiShiki en 18 Mayo 2012, 04:35 AM
durasno como se mencionó antes strok() no hace parte de <string> (http://www.cplusplus.com/reference/string/string/) y al compilar dará error:

Citarerror: 'strtok' no se declaró en este ámbito

Se debe incluir <cstring> (http://www.cplusplus.com/cstring) o <string.h> (http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.14.html) y esta última no pertenece a la librería estándar de C++

Saludos
Título: Re: Separar string Ayuda
Publicado por: durasno en 18 Mayo 2012, 05:04 AM
Lo q pasa es q yo copie el codigo que habia subido prometheus48 y no me di cuenta de eso :S, solo modifiq la part q estaba mal (o lo q me quisiste decir es q strtok no esta en C++?? )

Saludos
Título: Re: Separar string Ayuda
Publicado por: RyogiShiki en 18 Mayo 2012, 05:30 AM
Claro que si lo está! XD bueno pues si lo copias es entendible que se te haya pasado =D, en C++ se puede encontrar bajo <cstring>

Saludos
Título: Re: Separar string Ayuda
Publicado por: prometheus48 en 18 Mayo 2012, 18:12 PM
Citar
si lo quieres hacer con vectore, pues bueno aqui te dejo un ejemplo que acabo de hacer:

Código
vector<string> split(string str, char token) {
    vector<string> res;
    string tmp;
    for ( unsigned int i = 0; i <= str.length(); i++ ) {
        if ( str  == token || i == str.length() ) {
            if ( str[i + 1] == token ) continue;
            res.push_back(tmp);
            tmp.erase();
            i++;
        }
        tmp += str;
    }
    return res;
}

Espero te pueda servir de guia.

He intentado simular lo mejor posible el comportamiento del método split() en Ruby.

Saludos
« Última modificación: Hoy a las 07:19 por RyogiShiki »   Reportar al moderador     En línea


Exactamente lo que buscaba Muchísimas gracias RyogiShiki!

:D:D:D

Pero ahora tengo ortro problema(como no...), usar cin>>variable; Obligatoriamente cin>>variable; que cuando el usuario no introduce un valor, sino que directamente presiona enter, siga la ejecución como si el usuario hubiera introducido un valor.

Gracias adelantadas,

Salu2!!!
Título: Re: Separar string Ayuda
Publicado por: prometheus48 en 18 Mayo 2012, 18:37 PM
Olvidadlo ya lo he solucionado.

Gracias a todos.

Salu2!
Título: Re: Separar string Ayuda
Publicado por: RyogiShiki en 18 Mayo 2012, 18:52 PM
Bien, me alegro que haya sido de ayuda.

Saludos