Problema a la hora de usar string.h

Iniciado por aprendiz de programador, 30 Enero 2016, 17:39 PM

0 Miembros y 1 Visitante están viendo este tema.

aprendiz de programador

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.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void insercion_directa( char *nombre[]){
int i,j;
char aux[20];
for(i=1;i<4;i++){

strcpy(aux, nombre[i]);

j=i;

while(strcmp(nombre[j-1],aux)>0 && j>0){

strcpy(nombre[j],nombre[j-1]);
j--;
}
strcpy(nombre[j],aux);
}
}
int main(){

char *nombre[20];
nombre[20]=(char*)calloc(4,sizeof(char));
nombre[0]="Alberto";
nombre[1]="Joseluis";
nombre[2]="Iván";
nombre[3]="Becan";
insercion_directa(nombre);
for(int i=0;i<4;i++) printf(" %s\n", nombre[i]);

//strcpy y strcmp
return 0;
}

MAFUS

#1
En vez de
nombre[0]="Alberto";
Debes escribir
nombre[0] = calloc(strlen("Alberto") + 1, sizeof(char));
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 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.

mester


#include <stdio.h>
#include <string.h>
void insercion_directa(char nombre[4][20])
{
 short i,j;
 char aux[20];
 for(i = 1; i < 4; i++)
 {
   strcpy(aux, nombre[i]);
   j = i;
   while((strcmp(nombre[j-1],aux) > 0) && (j > 0))
   {
     strcpy(nombre[j], nombre[j-1]);
     j--;
   }
   strcpy(nombre[j],aux);
 }
}

int main()
{
 char nombre[4][20];
 strcpy(nombre[0], "Joseluis");
 strcpy(nombre[1], "Alberto");
 strcpy(nombre[2], "Iván");
 strcpy(nombre[3], "Becan");
 insercion_directa(nombre);
 for(int i=0;i<4;i++)
   printf(" %s\n", nombre[i]);
return 0;
}


Si usas arrays, usa solo los arrays, no juntes punteros con arrays ni cosas raras. Como consejo.
Justicia es dar a cada uno lo que se merece

furciorifa

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.

MAFUS

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.

void insercion_directa(char *nombre[]) {
int i, j, fin;
char *aux;
   
for(i = 1; i < 4; i++) {
        fin = 0;
        for(j = i; j > 0 && !fin; j--) {
            if(strcmp(nombre[j-1], nombre[j]) > 0) {
                aux = nombre[j-1];
                nombre[j-1] = nombre[j];
                nombre[j] = aux;
                fin = 1;
            }
        }
    }
}