2016-10-16 1 views
0
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
int Search_in_File(char *fname,char *str){ 
    FILE *fp; 
    int line_num = 1; 
    int find_result = 0; 
    char temp[512]; 
    if((fp = fopen(fname, "r")) == NULL) 
     return(-1); 

    while(fgets(temp, 512, fp) != NULL){ 
     if((strstr(temp, str)) != NULL){ 
      printf("A match found on line: %d\n", line_num); 
      printf("\n%s\n", temp); 
      find_result++; 
     } 
     line_num++; 
    } 
     if(find_result == 0){ 
      printf("\nSorry, couldn't find a match.\n"); 
     } 
     if(fp) 
      fclose(fp); 
    return(0); 
} 
void main(){ 
    char file_name[15]; 
    char *fname; 
    *fname=file_name[15]; 
    char *str; 
    char string_to_be_searched[15]; 
    *str=string_to_be_searched[15]; 
    int result, errno; 
    printf("Enter The File Name :"); 
    scanf("%s",fname); 
    printf("Enter The String To Be Searched :"); 
    scanf("%s",str); 
    result = Search_in_File(fname , str); 
    if(result==-1){ 
     perror("Error"); 
     printf("Error number = %d\n", errno); 
     exit(1); 
    } 
} 

J'ai écrit ce petit programme pour rechercher la chaîne à partir d'un fichier, mais il montre une erreur de segmentation (core dumped) dans gcc Linux Quelle est cette erreur? Comment puis-je le réparer?erreur de segmentation C (core dumped)

+0

Modifier votre question ... vous pouvez utiliser la touche de retour au code – Treycos

+0

@Treycos pouvez-vous préciser s'il vous plaît? – user7028056

+0

Votre code n'était pas lisible, j'ai édité – Treycos

Répondre

-1
char *fname; 
*fname=file_name[15]; 

Pensez à ce que le code fait. Lorsque vous attribuez une valeur à *fname, à quelle mémoire fname pointe-t-il?

La réponse est: fname est uninitialized pointeur, qui peut pointer vers une aléatoire emplacement en mémoire. Très probablement, il contient 0, donc en essayant de déréférencer il en résulte immédiatement SIGSEGV (mais ce n'est pas garanti).

Vous devriez également apprendre à utiliser un débogueur, ce qui vous indiquerait directement le problème.

+0

En fait, 'fname' contiendra le contenu du premier octet passé la fin du tableau' nom_fichier [] 'qui pourrait être n'importe quoi dans la plage 0 ... 255. – user3629249

-1

Cette partie du code provoque l'erreur de segmentation.

char file_name[15]; 
char *fname; 
*fname=file_name[15]; 
char *str; 
char string_to_be_searched[15]; 
*str= string_to_be_searched[15]; 

Votre pointeur doit pointer vers une adresse avant de l'utiliser,

fname = file_name; 

et

str= string_to_be_searched; 

prendrait soin de cela.

donc un code approprié serait

char file_name[15]; 
char *fname; 
fname=file_name; 
char *str; 
char string_to_be_searched[15]; 
str= string_to_be_searched; 

vous pourriez aussi avoir également utilisé malloc pour assigner la mémoire à vos pointeurs

char *fname; 
fname = (char*)malloc(sizeof(char)*15); 
char *str; 
str= (char*)malloc(sizeof(char)*15); 
+0

en C, le type renvoyé par les fonctions d'allocation de mémoire de tas (malloc, calloc, realloc) est' void * '. un tel type peut être affecté à n'importe quel autre pointeur. lancer le type retourné encombre juste le code rendant le code plus difficile à comprendre, déboguer, maintenir. – user3629249