Home > Blockchain >  (C programming) bus error on my linked list
(C programming) bus error on my linked list

Time:11-13

I'm learning to use linkedlist, I feel I already understand the concept but when coding why do I always get an error (bus error)....this code can run, but only until "SCANF the NAME" after that an error appears.

typedef struct Student{
    char name[20];
    char idNum[10];
    int  saving;

    struct Student *next;
}Student;

Student *head = NULL;

void insert_student(){
    char *name,*idNum;
    int saving;

    Student *current;
    Student *new_student;
    new_student = (Student*)malloc(sizeof(Student));

    // apakah ada memoory kosong?
    if(new_student==NULL){
        printf("==== YOUR MEMMORY IS FULL! ====\n");
        exit(0);
    }

    printf("Enter your name     : ");scanf("%[^\n]s",name);
    printf("Enter your Id       : ");scanf("%[^\n]s",idNum);
    printf("How many your money : Rp");scanf("%d",&saving);

    strcpy(new_student->name,name);
    strcpy(new_student->idNum,idNum);
    new_student->saving = saving;

    new_student->next = NULL;

    if(head==NULL){
        head = new_student;
    }
    else{
        current = head;
        while (current->next != NULL)
        {
            current = current->next;
        }
        current->next = new_student;
    }
}
void print_students(){
    Student *current;

    if(head==NULL){
        printf("==== THERE IS NO STUDENT YET!\n");
        exit(0);
    }
    current = head;
    while (current!= NULL)
    {
        printf("Name   : %s",current->name);
        printf("id     : %s",current->idNum);
        printf("Saving : Rp%d",current->saving);

        current = current->next;
    }
    
}

int main(){
    insert_student();
    print_students();
return 0;
}

I'm hoping to create nodes for the dynamic linked-list Student and then display them

CodePudding user response:

  printf("Enter your name     : ");scanf("%[^\n]s",name);
  printf("Enter your Id       : ");scanf("%[^\n]s",idNum);

You have to give named and idNum meaningful values before you pass their values to scanf. Instead, you are just passing uninitialized garbage value to scanf, which won't work. You must pass to scanf pointers to the place you want the strings you're reading in to be stored.

CodePudding user response:

For starters it is a bad idea to make the functions to depend on the global variable head. In this case you will not be able to use more than one list in the program.

Within the function insert_student you declared uninitialized pointers name and idNum:

char *name,*idNum;

So using them in the calls of scanf

printf("Enter your name     : ");scanf("%[^\n]s",name);
printf("Enter your Id       : ");scanf("%[^\n]s",idNum);

invokes undefined behavior.

You need to declare character arrays instead of pointers

char name[20], idNum[10];

Also the format specifications are incorrect.

You should write

printf("Enter your name     : "); scanf( " [^\n]", name );
printf("Enter your Id       : "); scanf( " %9[^\n]", idNum );

Pay attention to the leading space in the format strings It allows to skip white space characters.

Otherwise after this call of scanf

printf("How many your money : Rp");scanf("%d",&saving);

the input buffer will contain the new line character '\n'. So when you will call the function insert_student a second time the first call of scanf (if the format specification does not contain the leading space)

printf("Enter your name     : "); scanf( "[^\n]", name );

will read an empty string.

Also it is not a flexible approach when the whole program exits if a new node was not allocated.

if(new_student==NULL){
    printf("==== YOUR MEMMORY IS FULL! ====\n");
    exit(0);
}

It will be better to return to the caller an integer that will report whether the function was executed successfully. For example

int insert_student( void )
{
    //...
    Student *new_student;
    new_student = (Student*)malloc(sizeof(Student));
   
    int success = new_student != NULL;

    if ( success )
    { 
        printf("Enter your name     : ");scanf("%[^\n]s",name);
        printf("Enter your Id       : ");scanf("%[^\n]s",idNum);
        printf("How many your money : Rp");scanf("%d",&saving);
        //...
    }

    return success;
}
  • Related