Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: marchiali en 24 Julio 2014, 17:02 pm



Título: ayuda con strings
Publicado por: marchiali en 24 Julio 2014, 17:02 pm
hola. quisiera que me guien un poco con el uso de las funciones de strings en c++.
lo que estoy tratando es de programar un algoritmo que, mediante una funcion, encuentre un char dentro de una cadena(string) y que la parte de la cadena anterior al char la copie en una cadena vacia, y la parte posterior al char en otra. el char no se copia en ninguna. lo que hice fue esto:

void split(char *s[], char *c1[], char *c2[], char *car){
   if (strstr(s[60], car)){
      char aux=s-strlen(strstr(s[60], car));
      strcat(c1[60], aux);
      strcat(c2[60], (strchr(s[60], (strlen(car)+1))));
   }
}

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

pero me da errores, como que no puedo convertir char a const char. que significa esto? y como puedo arreglarlo? gracias.


Título: Re: ayuda con strings
Publicado por: eferion en 24 Julio 2014, 17:09 pm
Nota incial: Para el código, usa las etiquetas GeSHi, gracias.

Código
  1. void split(char *s[], char *c1[], char *c2[], char *car){
  2.   if (strstr(s[60], car)){
  3.      char aux=s-strlen(strstr(s[60], car));
  4.      strcat(c1[60], aux);
  5.      strcat(c2[60], (strchr(s[60], (strlen(car)+1))));
  6.   }
  7. }

'strstr' devuelve el puntero a la primera aparición de 'car'... si reutilizases ese valor tendrías medio trabajo hecho...

Una cosa que no entiendo es por qué tienes 's[60]' en el strstr, en el strlen, en... eso está mal.

Código
  1. void split(char *s[], char *c1[], char *c2[], char *car){
  2.   if (strstr(s, car)){
  3.      char aux=s-strlen(strstr(s, car));
  4.      strcat(c1, aux);
  5.      strcat(c2, (strchr(s, (strlen(car)+1))));
  6.   }
  7. }

De primeras no se si así funcionará... no puedo compilar ahora, pero al menos pasas punteros a las funciones en vez de valores que no tienen ningún sentido.


Título: Re: ayuda con strings
Publicado por: marchiali en 24 Julio 2014, 17:27 pm
probe con tus correcciones pero el programa no compila. yo le puse indices a los strings porque crei que era necesario dimencionarlos. no hace falta cuando se programa en una funcion?


Título: Re: ayuda con strings
Publicado por: eferion en 24 Julio 2014, 17:40 pm
El tamaño de los arrays solo hay que ponerlo, salvo que se me olvide algún caso concreto, en las siguientes circunstancias:

* Cuando los declaras en el stack (es decir, no usas memoria dinámica):

Código
  1. char cadena[200];

* Cuando pasas un array multidimensional ubicado en el stack como parámetro de una función:

Código
  1. void procesarMatriz( int matriz[10][20] );

Cuando usas un arreglo, una vez creado, el compilador ya sabe qué es lo que está manejando... no necesitas recordárselo cada dos líneas. Además que tu código es peligroso:

Código
  1. char cadena[4];
  2. strcpy( cadena, "abc" ); // Ok
  3.  
  4. printf( "%c %c %c", cadena[ 0 ], cadena[ 1 ], cadena[ 2 ] );

Fíjate que al pasar el índice recupero uno de los elementos del arreglo... funciones como strstr, strcpy... necesitan un puntero que indice dónde deben empezar a leer / escribir... si en vez de eso les pasas otra cosa acabarán escribiendo en zonas de memoria que no te corresponden y el programa, en el mejor de los casos, fallará estrepitosamente.

En el ejemplo que te he puesto, si hubieses puesto

Código
  1. strcpy( cadena[4], "abc" );

Estarías indicando que quieres que se copie en la dirección apuntada por el cuarto elemento de cadena, la secuencia "abc"... puedes acabar escribiendo en cualquier parte de la memoria por error.

Si no eres capaz de entender lo que intento explicarte no te asustes, eso únicamente quiere decir que deberías comprarte un buen libro de C y seguirlo desde el principio antes de continuar con este tipo de prácticas... los inicios en la programación nunca son fáciles.


Título: Re: ayuda con strings
Publicado por: marchiali en 24 Julio 2014, 17:55 pm
si, es bastante complicado pero de a poco creo que lo voy entendiendo. gracias por la ayuda!