Separar string Ayuda

Iniciado por prometheus48, 17 Mayo 2012, 18:03 PM

0 Miembros y 2 Visitantes están viendo este tema.

prometheus48

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.
"Si tú tienes una manzana, y yo otra, y las intercambiamos, tu sigues teniendo una manzana, y yo sigo teniendo una manzana.
Pero, si tu tienes una idea, y yo otra, y nos las intercambiamos, tu tienes dos ideas, y yo tengo dos ideas"
The knowledge is free

satu

Hola

Para eso puedes usar la función strtok

Saludos
Breakbeat como forma de vida

prometheus48

No funciona:

Dice: strtok was not declared in this scope.
"Si tú tienes una manzana, y yo otra, y las intercambiamos, tu sigues teniendo una manzana, y yo sigo teniendo una manzana.
Pero, si tu tienes una idea, y yo otra, y nos las intercambiamos, tu tienes dos ideas, y yo tengo dos ideas"
The knowledge is free


satu

Hola

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

Saludos
Breakbeat como forma de vida

prometheus48

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 ===|
"Si tú tienes una manzana, y yo otra, y las intercambiamos, tu sigues teniendo una manzana, y yo sigo teniendo una manzana.
Pero, si tu tienes una idea, y yo otra, y nos las intercambiamos, tu tienes dos ideas, y yo tengo dos ideas"
The knowledge is free

RyogiShiki

#6
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


prometheus48

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!
"Si tú tienes una manzana, y yo otra, y las intercambiamos, tu sigues teniendo una manzana, y yo sigo teniendo una manzana.
Pero, si tu tienes una idea, y yo otra, y nos las intercambiamos, tu tienes dos ideas, y yo tengo dos ideas"
The knowledge is free

RyogiShiki

#8
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


durasno

#9
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
Ahorrate una pregunta, lee el man