2015-12-23 1 views
1

J'ai essayé de compiler et exécuter le programme suivant pour inverser une chaîne en utilisant le compilateur gcc pour linux mais il montre l'erreur: erreur de segmentation (core dumped) .I a même essayé de déboguer en utilisant gdb mais ça n'a pas aidé. Le programme donné ci-dessous introduit d'abord t qui est le nombre de cas de test. J'ai testé le programme avec 3 cas de test mais après avoir pris la 2ème entrée de l'utilisateur, le compilateur montre une erreur.erreur de segmentation (core dumped) erreur dans le programme C

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
char* strrev(char*); 

int main(int argc, char *argv[]) 
{ 
     int t,i=0,temp=0; 
     char *str[10],*rev[10]; 
     scanf("%d",&t); //input the number of test cases 
     while(i<t) 
     { 
      scanf("%s",str[i]); 
      i++; 
     } 
     while(temp<t) //reverse the string and display it 
     { 
      rev[temp]=strrev(str[temp]); 
      printf("%s \n",rev[temp]); 
      temp++; 
     } 
    return 0; 
    getchar(); 
} 

Fonction pour inverser la chaîne:

char *strrev(char *str) 
{ 

    int i = strlen(str)-1,j=0; 

    char ch; 
    while(i>j) 
    { 
     ch = str[i]; 
     str[i]= str[j]; 
     str[j] = ch; 
     i--; 
     j++; 
    } 
    return str; 
} 

Répondre

5

Vous obtenez une erreur de segmentation parce que vous avez pas d'espace alloué pour les éléments de str. Vous devez d'abord allouer de la mémoire dans la fonction main.

scanf("%d",&t); //input the number of test cases 

if(t <= 10) 
    for(size_t i = 0; i < t; i++) 
     str[i] = malloc(50); // Assuming string is no more than 50characters. 
else 
    exit(0); 

De plus, votre code comporte de nombreuses failles. Voici le code après les fixer

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
void strrev(char*); // Change return type to void 

int main(void) 
{ 
    int t,i=0,temp=0, ch; 
    char *str[10]; 
    scanf("%d",&t); //input the number of test cases 
    while((ch = getchar()) != EOF && ch != '\n'); // To consume newline character after scanf 

    // Allocate memory for str elements 
    if(t <= 10) 
     for(size_t i = 0; i < t; i++) 
      str[i] = malloc(50); // Assuming string is no more than 50characters. 
    else 
     exit(0); 

    i = 0; 
    while(i < t) 
    { 
     fgets(str[i],50,stdin); // Use fgets instead of scanf to read string 
     i++; 
    } 
    while(temp<t) //reverse the string and display it 
    { 
     // Since you are reversing string by flipping the characters the same 
     // string just pass pointer to it. str[temp] will be updated in function. 
     strrev(str[temp]); 
     printf("Reverse is %s \n", str[temp]); 
     temp++; 
    } 
    return 0; 
} 

void strrev(char *str) 
{ 

    size_t i = strlen(str)-1,j=0; 
    char ch; 
    while(i>j) 
    { 
     ch = str[i]; 
     str[i]= str[j]; 
     str[j] = ch; 
     i--; 
     j++; 
    } 
    //printf("Reverse is %s \n", str); 
} 
2

vous avez manqué à allouer de la mémoire avant de lire char * valeur, vous pouvez le faire:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
char* strrev(char*); 

int main(int argc, char *argv[]) 
{ 
     int t,i=0,temp=0; 
     char *str[10],*rev[10]; 
     scanf("%d",&t); //input the number of test cases 
     while(i<t) 
     { 
      str[i] = (char*)malloc(100); // just allocate memory 
      scanf("%s", str[i]); 
      i++; 
     } 
     while(temp<t) //reverse the string and display it 
     { 
      rev[temp]=strrev(str[temp]); 
      printf("%s \n",rev[temp]); 
      temp++; 
     } 
    return 0; 
    getchar(); 
} 
+0

bien, j'ai inséré la ligne pour l'allocation de mémoire, mais cela n'a pas fonctionné. J'ai essayé d'exécuter ce programme sur CLion mais cela montre une autre erreur indiquant que la conversion de 'void *' en 'char *' est invalide. –

+0

Mais quand j'ai typecasted le pointeur à (char) *, cela a fonctionné parfaitement .. –

+1

@haccks SInce la sortie est stockée dans le tableau de rev, il n'y a pas besoin d'allouer de la mémoire pour cela. –

1
char *str[10],*rev[10]; 

Vous n'avez pas affecté le stockage à la chaîne tenir valeurs encore pour ces pointeurs.

char * str; /* this is a string pointer */ 

char * str = malloc(15); /* this creates storage for a string */ 

char str[10]; /* this creates a static char array, also is a string */ 
0

J'ai également eu le même problème. Je l'ai juste corrigé en corrigeant les indices de la matrice.