| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
marchiali
Registrado: 29 Jul 2014 Mensajes: 2
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |