Why am I getting segmentation fault in search_lastname function?

The following program accepts data from the user of the student's first name, last name and grades. The search_lastname function is expected to search records for the specified last name. But it gives a segmentation fault. Another feature is to print the entries, and the cases for the switch were created for additional features not yet added to the program.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char **first_name, **last_name;
float *score;
int entry;
void print();
void search_lastname(char search_last_name[21]);
int main()
{
int i,option;
char search_last_name[21];
do
    {
    printf("\nPlease indicate the number of records you want to enter (The minimum number of entries is 5) :");                     
    scanf("%d",&entry);
    }
while(entry<=4);
score=(float*)malloc(entry*sizeof(float));
first_name=(char**)malloc(entry*sizeof(char*));
last_name=(char**)malloc(entry*sizeof(char*));
for(i=0;i<entry;i++)
    {
    first_name[i]=(char*)malloc(21*sizeof(char));
    last_name[i]=(char*)malloc(21*sizeof(char));
    }
printf("Please input records of students (enter a new line after each record), with following format first name last name score \n");
for(i=0;i<entry;i++)
    {
    scanf("%s%s%f",&first_name[i],&last_name[i],&score[i]);                                                             /*Input of records itself*/
    }
do
{
    printf("\nPlease choose the appropriate options :");                                                /*Switch statement for choosing options.*/
    printf("\nPrint records (press 1)\nAdd a new record (press 2)\nDelete records (press 3)\nSearch by last name (press 4)\nSort by score (press 5)\nSort by last name (press 6)\nFind Median score (press 7)\nExit the Program (press 0)");
    scanf("%d",&option);
    switch(option)
        {
        case 1  :print();
            break;
        case 2  :
            break;
        case 3  :
            break;
        case 4  :
            printf("\n Please enter the last name you want to search: ");
            scanf("%s",search_last_name);
            search_lastname(search_last_name);
            break;
        case 5  :
            break;
        case 6  :
            break;
        case 7  :
            break;
        case 0  :
            break;
        default : 
            printf("\n Please enter a valid option.");
        }
}
while(option>=1 && option<=7);
return 0;
}

void print()
{
int i;
printf("\n The records of students are as follows :");
for(i=0;i<entry;i++)
    {
    printf("\nFirst name:%s, Last name:%s, Score:%f\n",&first_name[i],&last_name[i],score[i]);
    }
}


void search_lastname(char search_last_name[21])                                     /*Funtion to search by last name*/  
{
int i,counter=0;
for(i=0;i<entry;i++)
    {
    if(strcmp(search_last_name,last_name[i])==0)
        {
        printf("\nFirst name:%s, Last name:%s, Score:%f\n",first_name[i],last_name[i],score[i]);
        }
    }

}

      

+3


source to share


1 answer


your problem is with using the function scanf()

. You need to change

scanf("%s%s%f",&first_name[i],&last_name[i],&score[i]);

      

to

scanf("%20s %20s %f", first_name[i], last_name[i], &score[i]);

      



Without a length modifier, your specifier %s

will not be able to split the input strings and thus will overwrite the memory area per allocated memory, causing undefined behavior.

In addition, it is highly recommended that you check the return value scanf()

to ensure correct input.

Note:

  • Recommended signature main()

    - int main(void)

    .
  • Don't discard return value malloc()

    and families.
+2


source







All Articles