Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: aprendiz de programador en 30 Enero 2016, 17:39 pm



Título: Problema a la hora de usar string.h
Publicado por: aprendiz de programador en 30 Enero 2016, 17:39 pm
Buenas programadores, resulta que me da una violacion del segmento al intentar realizar una insercion directa, a traves de cadenas de caracteres, lo que me gustaria es poder ordenarlas a traves de su orden lexicografico..
Un saludo, y gracias de antemano.
PD: el problema me lo da a la hora de usar strcpy y no entiendo porque.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void insercion_directa( char *nombre[]){
  5. int i,j;
  6. char aux[20];
  7. for(i=1;i<4;i++){
  8.  
  9. strcpy(aux, nombre[i]);
  10.  
  11. j=i;
  12.  
  13. while(strcmp(nombre[j-1],aux)>0 && j>0){
  14.  
  15. strcpy(nombre[j],nombre[j-1]);
  16. j--;
  17. }
  18. strcpy(nombre[j],aux);
  19. }
  20. }
  21. int main(){
  22.  
  23. char *nombre[20];
  24. nombre[20]=(char*)calloc(4,sizeof(char));
  25. nombre[0]="Alberto";
  26. nombre[1]="Joseluis";
  27. nombre[2]="Iván";
  28. nombre[3]="Becan";
  29. insercion_directa(nombre);
  30. for(int i=0;i<4;i++) printf(" %s\n", nombre[i]);
  31.  
  32. //strcpy y strcmp
  33. return 0;
  34. }
  35.  


Título: Re: Problema a la hora de usar string.h
Publicado por: MAFUS en 30 Enero 2016, 18:21 pm
En vez de
Código
  1. nombre[0]="Alberto";
Debes escribir
Código
  1. nombre[0] = calloc(strlen("Alberto") + 1, sizeof(char));
  2. strcpy(nombre[0], "Alberto");


De hecho, ya que tu lista son punteros a char debes reestructurar todo el programa para trabajar con punteros, no con arrays. Y ya que usas punteros en la función insercion_directa no debes hacer uso de strcpy sino moveri directamente los punteros.

Otra forma sería usar una lista cuadrada, al estilo
Código
  1. char nombre[4][80];
entonces la programación sería más sencilla pero tendrías muchos bytes que no usarías.

Recuerda que, ya que tienes que usar calloc, cuándo termines de usar los datos debes liberar la memoria con free.


Título: Re: Problema a la hora de usar string.h
Publicado por: mester en 30 Enero 2016, 19:02 pm
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3. void insercion_directa(char nombre[4][20])
  4. {
  5.  short i,j;
  6.  char aux[20];
  7.  for(i = 1; i < 4; i++)
  8.  {
  9.    strcpy(aux, nombre[i]);
  10.    j = i;
  11.    while((strcmp(nombre[j-1],aux) > 0) && (j > 0))
  12.    {
  13.      strcpy(nombre[j], nombre[j-1]);
  14.      j--;
  15.    }
  16.    strcpy(nombre[j],aux);
  17.  }
  18. }
  19.  
  20. int main()
  21. {
  22.  char nombre[4][20];
  23.  strcpy(nombre[0], "Joseluis");
  24.  strcpy(nombre[1], "Alberto");
  25.  strcpy(nombre[2], "Iván");
  26.  strcpy(nombre[3], "Becan");
  27.  insercion_directa(nombre);
  28.  for(int i=0;i<4;i++)
  29.    printf(" %s\n", nombre[i]);
  30. return 0;
  31. }

Si usas arrays, usa solo los arrays, no juntes punteros con arrays ni cosas raras. Como consejo.


Título: Re: Problema a la hora de usar string.h
Publicado por: furciorifa en 30 Enero 2016, 21:23 pm
Citar
Si usas arrays, usa solo los arrays, no juntes punteros con arrays ni cosas raras. Como consejo.

el uso de char* arreglo[10]; es totalmente válido, no pasa nada, son 10 punteros apuntando a caracter, no tiene ninguna violación.


Título: Re: Problema a la hora de usar string.h
Publicado por: MAFUS en 30 Enero 2016, 22:12 pm
Tienes un problema de base y es que las cadenas literales NO se pueden modificar porque son constantes.

Así cuándo en tu programa quieres hacer un strcpy de una cadena a otra realizas una operación ilegal de modificación de una zona de memoria con solo permiso de lectura.

Para hacer strcpy necesitas que la memoria pueda ser modificable y eso lo puedes hacer accediendo a la memoria del montón con malloc o calloc. En ese caso debes pensar que copias una cadena más larga a otra que tiene menor espacio estarás escribiendo en una zona de datos desconocida. Por eso podrías definir una tabla con el tamaño de la mayor cadena.

O, como dije, puedes intercambiar punteros con lo que no incurrirás a problemas de espacio y podrás seguir usando el array de punteros.

Código
  1. void insercion_directa(char *nombre[]) {
  2. int i, j, fin;
  3. char *aux;
  4.  
  5. for(i = 1; i < 4; i++) {
  6.        fin = 0;
  7.        for(j = i; j > 0 && !fin; j--) {
  8.            if(strcmp(nombre[j-1], nombre[j]) > 0) {
  9.                aux = nombre[j-1];
  10.                nombre[j-1] = nombre[j];
  11.                nombre[j] = aux;
  12.                fin = 1;
  13.            }
  14.        }
  15.    }
  16. }