Sử dụng hàm fgets để nhập struct nhưng khi in bị mất phần tử đầu tiên

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

typedef struct STUDENT {
    char hoten[30];
}Student;

void ReadStudent(Student std[],int n)// nhap ten hoc sinh
{
    for(int i =0; i<n; i++)
    {
        printf("Nhap ten cho hoc sinh thu %d.\n", i+1);
        fgets(std[i].hoten, 30,stdin);
    }
}

char tachChuCaiDau(char hoten[]){//tach chu cai dau cua ten
    int i =strlen(hoten)-1;
    
    while(hoten[i] != ' ') i --;
    return hoten[i+1];
}

char *tachTen(char hoten[]){//tach ten
    int i = strlen(hoten)-1;
    
    while(hoten[i]!= ' ') i--;
    return &hoten[i+1];
}

Student *arrangeStudent(Student std[],int n)// sap xep hoc sinh theo abc
{
    Student temp;
    //so sanh vs [i+1]
    //neu ...  thi doi cho
    for(int i =0; i< n-1; i++){
        for(int j = i+1; j< n; j++){
            if((int)tachChuCaiDau(std[i].hoten)>(int)tachChuCaiDau(std[i+1].hoten))
            {
                temp = std[i];
                std[i] = std[j];
                std[j] = temp;
            }
        }
    }

    return std;
}

void printStudent(Student *std,int n)// in hoc sinh theo sap xep
{
    printf("%-50s%-20s\n","Number","Name");

    for(int i=0; i<n; i++){
        printf("%-50d%-20s",i+1,(std+i)->hoten);
        printf("\n\n");
    }
}

int main()
{
    int num;
    printf("Input number of student: ");
    scanf("%d",&num);
    Student std[num];

    ReadStudent(std, num);
    arrangeStudent(std, num);
    printStudent(std,num);
    return 0;
}
1 Like

Không hiện phần tử hoc sinh thu 0

Vấn đề nằm ở scanf:

scanf("%d",&num);

Vì khi nó gặp whitespace như newline thì nó dừng chứ không “ăn” cái whitespace đó nên lần sau gọi fgets thì nó vẫn gặp newline nên bỏ qua luôn bước nhập đầu tiên.
Giải pháp:

  1. Chủ động “ăn” cái whitespace đó.
  2. scanf sucks:
char tmp[30];
fgets(tmp, 30, stdin);
num = atoi(tmp);

@Viet_Hung_Vu: không in 0i đã được tăng 1 tại hàm printStudent

...
        printf("%-50d%-20s",i+1,(std+i)->hoten);
...
4 Likes

Fanstatic, ý kiến đã giúp tồi nhiều

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?