-1
  1. My first fgets get ignored when i run it, it straight jump to the second fgets why it is?i expect it will the fgets to get the user input for student name but it doesn't.So i cannot get the name for student

    printf("Enter the name of the student\n");
                fgets(name, 100, stdin);
    printf("Enter the gender of the student\n");
                fgets(gender,100,stdin);
    printf("Enter the course of the student\n");
                fgets(course,100,stdin);
                number++;
    
  2. My print_begin() function could print out 2 input data which mean if the studentlist have 4 struct it only print out two. But my print_last work well to print all the input.

    void print_begin(){
    
    struct node *tempdisplay;
    tempdisplay = studentlist;
    
    if (studentlist == NULL)
    printf("List is empty\n");
    else
    {
        while (tempdisplay!= NULL)
        {
        printf("student name   = %s", tempdisplay->student_name);
        printf("student gender = %s", tempdisplay->student_gender);
        printf("student course = %s", tempdisplay->student_course);
        printf("Student Number = %d\n\n", tempdisplay->student_number);
        tempdisplay = tempdisplay->next;
        }
    }
    printf("\n\nPress any key to go back main menu\n");
    getch();
    }
    

this is the whole code

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct node
{
    char student_name[40];
    char student_gender[40];
    char student_course[40];
    int student_number;
    struct node *next;
    struct node *prev;
}*newnode, *studentlist,*temp,student;

void insert_last(){

}

void print_begin(){

    struct node *tempdisplay;
    tempdisplay = studentlist;

    if (studentlist == NULL)
        printf("List is empty\n");
    else
    {
        while (tempdisplay!= NULL)
        {
            printf("student name   = %s", tempdisplay->student_name);
            printf("student gender = %s", tempdisplay->student_gender);
            printf("student course = %s", tempdisplay->student_course);
            printf("Student Number = %d\n\n", tempdisplay->student_number);
            tempdisplay = tempdisplay->next;
        }
    }
    printf("\n\nPress any key to go back main menu\n");
    getch();
}

void print_last(){
    struct node *tempdisplay;
    tempdisplay = studentlist;

    if (studentlist == NULL)
        printf("List is empty\n");
    else
    {
        while (tempdisplay->next != NULL)
        {
            tempdisplay = tempdisplay->next;
        }
        while (tempdisplay != NULL)
        {
            printf("student name   = %s", tempdisplay->student_name);
            printf("student gender = %s", tempdisplay->student_gender);
            printf("student course = %s", tempdisplay->student_course);
            printf("Student Number = %d\n\n", tempdisplay->student_number);
            tempdisplay = tempdisplay->prev;
        }
    }
    printf("\n\nPress any key to go back main menu\n");
    getch();
}

void remove_student(){

}

void insert_new(char name[], char xgender[], char xcourse[], int number){
    newnode = NULL;
    newnode = (struct node*)malloc(sizeof (struct node));
    strcpy(newnode->student_name,name);
    strcpy(newnode->student_gender, xgender);
    strcpy(newnode->student_course, xcourse);
    newnode->student_number = number;
    newnode->next = NULL;
    newnode->prev = NULL;

    if (studentlist == NULL)
    {
        studentlist = newnode;
    }
    else
    {
        while (studentlist->next != NULL)
        {
            studentlist = studentlist->next;
        }
        newnode->prev = studentlist;
        studentlist->next = newnode;
    }

    printf("Insert success\n");
    printf("Press any key to go back main menu\n");
    getch();
}

main()
{
    studentlist=NULL;
    char name[40];
    char gender[40];
    char course[40];
    int number = 0;
    int main_choice;

    do{
        printf("\n");
        printf("\n");
        printf("\n");
        printf("               1.Add a new student to the beginning\n");
        printf("               2.Add a new student to the end\n");
        printf("               3.Print out the entire list from the beginning\n");
        printf("               4.Print out the entire list from the end\n");
        printf("               5.Remove a student from the list\n");
        printf("               6.Quit the program\n");
        printf("\n\nEnter the number of the options\n");
        scanf("%d", &main_choice);
        switch (main_choice){
        case 1: {
                    printf("Enter the name of the student\n");
                    fgets(name, 100, stdin);
                    printf("Enter the gender of the student\n");
                    fgets(gender,100,stdin);
                    printf("Enter the course of the student\n");
                    fgets(course,100,stdin);
                    number++;

                    insert_new(name,gender,course,number);
        }break;
        case 2: insert_last(); break;
        case 3: print_begin(); break;
        case 4: print_last(); break;
        case 5: remove_student(); break;
        case 6:{
                   printf("\n\n\nThe program is closing...\n...\n");
                   return 0;
                }break;
        }
        system("cls");
    } while (main_choice != 6);
}
  • 2
    tldr ... you are probably mixing `scanf()` and `fgets()`. The `scanf()` leaves the `'\n'` in the input buffer and `fgets()` reads an empty line. – pmg Apr 13 '14 at 11:46
  • Also dont put `return 0` inside `case 6`. It will come out of loop anyways in that case – GoldRoger Apr 13 '14 at 11:56
  • It might be worth it if you took a second to read your code and evaluate if this is the shortest possible program that exhibits the problem. You might want to read this: http://www.sscce.org/ – carlosdc Apr 13 '14 at 11:57
  • @pmg How should i edit it? i just replace the fgets to all the scanf. – user3042789 Apr 13 '14 at 12:01

1 Answers1

1

The reasons for your problems are

  1. Same reason as @pmg mentioned in comments. fgets reads an empty line left over due to scanf. To solve this, use fgets to read the mainchoice to temporary char buffer. Use atoi to convet it to int and store in x. Rest of the program will be same. Try to avoid scanf.

  2. In insert_new, you are changing the studentlist pointer. So this causes problem while printing from start. Use a temporary variable to reach till the end. Dont alter studentlist. It should always point to start of the list. Do in the same way as you did in print function.

Community
  • 1
  • 1
GoldRoger
  • 1,263
  • 7
  • 10
  • for the second problem, i edit already but still the same.I entered 4 student data to the end. But when i print out the entire list from the beginning , it only shows the third and fourth student data and ignore the first and thee second. But it work well if i print from the last. – user3042789 Apr 13 '14 at 12:59