/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

funciones con strings

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
marchiali



Registrado: 29 Jul 2014
Mensajes: 2

MensajePublicado: 29/07/2014 6:03 am
Título: funciones con strings

hola. tengo problemas con un ejercicio de programacion y necesito una mano.
el ej. en cuestion es este: mediante una funcion split(s, c1, c2, car); donde los 3 primero parametros son strings al estilo c y el tercero de tipo char. tengo que hacer q la funcion detecte a "car" dentro de la cadena s y copiar la parte de s anterior a car en c1 y en c2 copiar la parte de s posterior a car. car no se copia en ningun lado.

esto es lo que pude hacer, pero el cod. no funciona si pueden decirme por que y como arreglarlo se los agradeceria.

Código:
#include <iostream>
#include <string>
using namespace std;

void split(char s[], char &c1, char &c2, char car){
   char aux[40]= strchr(s, car);
   
   if (aux != NULL){
      strcat(c1, s, (strlen(s)-strlen(car)));
      strcat(c2, (aux+1));
   }
   
}



int main(int argc, char *argv[]) {
   
   char s[40], c1[40], c2[40];
   char car;
   
   cin.getline(s, 40);
   cin>>car;
   
   split(s, c1, c2, car);
   cout<<c1;
   cout<<c2;
   
   return 0;
}
Volver arriba
dehm



Registrado: 29 Abr 2011
Mensajes: 143

MensajePublicado: 30/07/2014 1:20 am
Título:

La verdad es que estas usando mal las funciones de cstring, ya que strchr devuelve un puntero a char, y strcat espera dos parámetros, y en una de las llamadas le pones 3.

Sin hacer uso de las funciones de biblioteca, yo lo he hecho así:
Código:
#include <iostream>

using namespace std;

void split(char* s, char* c1, char* c2, char car)
{
    int i=0;
    int j=0;
    while (s[i]!=car)
        {
            c1[i]=s[i];
            i++;
        }
    c1[i]='\0';
    while (s[i]!='\0')
        {
            c2[j]=s[i];
            i++;
            j++;
        }
    c2[j]='\0';
}



int main(int argc, char *argv[])
{

    char s[40], c1[40], c2[40];
    char car;
    cout<<"Introduce frase"<<endl;
    cin.getline(s, 40);
    cout<<"Introduce caracter delimitador"<<endl;
    cin>>car;
    split(s, c1, c2, car);
    cout<<c1<<endl;
    cout<<c2<<endl;

    return 0;
}


La idea es recorrer el array s[], en un primer tramo, hasta encontrar el caracter delimitador. Los caracteres se irán copiando a c1.
Luego añadimos de forma "manual" el caracter '\0' para dejar la cadena c1 lista
Despues seguimos recorriendo el array s[] hasta encontrar el caracter de fin de cadena, el '\0'. Ahora necesitamos otro indice que empiece en 0 para c2, porque ya no coincide con el de s, ya que estaremos en un punto intermedio de la misma.
Terminada la copia, volvemos a añadir el '\0' a c2.
Saludos!
_________________
Aprendiendo
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7530
Ubicación: Mexico

MensajePublicado: 30/07/2014 10:04 am
Título: Re: funciones con strings

marchiali escribió:
si pueden decirme por que y como arreglarlo se los agradeceria.

No quiero sonar grosero pero todas las lineas de la función "split" tienen errores importantes (algunos ya los comento dehm) empezando por el tipo de los parámetros (los tres primeros deben ser de tipo "char *") y el nombre correcto del encabezado a incluir es <cstring>.

Si no tienes un curso o libro de calidad debes conseguir uno, para recomendaciones revisa la sección "Cursos" de este sitio y utiliza su motor de búsqueda.

En cuanto a la función esta se puede implementar de la forma mas sencilla mediante dos bucles (revisa el ejemplo de dehm), otra forma ligeramente es:
Código:
void split(char str[], char a[], char b[], char ch)
{
   int i;
   int j;

   j = 0;
   for (i = 0; str[i] != '\0' && str[i] != ch; i++)
      a[j++] = str[i];
   a[j] = '\0';
   
   if (str[i] != '\0')
      i++;
   for (j = 0; (b[j] = str[i]) != '\0'; i++, j++)
      ;
}


Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
marchiali



Registrado: 29 Jul 2014
Mensajes: 2

MensajePublicado: 30/07/2014 3:41 pm
Título:

gracias por la ayuda! esos ejemplos me sirvieron mucho. soy estudiante de ingenieria y recien estoy empezando en esto de la programacion asi que les agradezco su ayuda ya que me es muy util para mejorar
Volver arriba
leosan



Registrado: 19 Abr 2012
Mensajes: 730
Ubicación: GRAN CANARIA

MensajePublicado: 31/07/2014 12:53 am
Título: Re: funciones con strings

Y si seguimos en tu idea inicial de usar strchr podemos hacer:

Código:
#include <iostream>
#include <cstring>

using namespace std;

void split ( char* s , char* c1 , char* c2 , char car ) {
  char * pch = strchr ( s , car ) ;
  strcpy ( c1 , pch + 1 ) ;
  strncpy ( c2, s, strlen ( s ) -  strlen ( c1 ) - 1 ) ;
  c2 [ strlen ( s ) -  strlen ( c1 ) ] = '\0' ;
}

int main( ) {
    char s[40] = "0321123456789123" , c1[40] , c2[40] ;
    char car = '4' ;
    /*cout << "Introduce frase" << endl;
    cin.getline ( s , 40 ) ;
    cout << "Introduce caracter delimitador" << endl ;
    cin >> car ; */
    split ( s , c1, c2 , car ) ;
    cout << c1 << endl ;
    cout << c2 << endl ;
    return 0 ;
}


¡¡¡¡ Saluditos! ..... !!!!
Volver arriba
daltomi



Registrado: 28 Abr 2007
Mensajes: 335
Ubicación: Argentina

MensajePublicado: 31/07/2014 7:27 pm
Título:

Otro ejemplo:
Código:

#include <string.h>
#include <stdio.h>

 void split(char* s, char* c1, char* c2, const char* car)
{
   char *token = strtok(s, car);

   strcpy(c1, token);
   
   token = strtok(NULL, car);
   
   strcpy(c2, token);
}

 int main(int argc, char *argv[])
 {
     char c1[40], c2[40];
     
     char s[] = "0123456car7890";
     const char* car = "car";

     split(s, c1, c2, car);

     printf("%s\n%s\n\n", c1, c2);

     return 0;
 }


Saludos.
Volver arriba
Dirección AIM
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com