01/10/2018, 14:16

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.
", 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
","Number","Name");

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

");
    }
}

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;
}
Việt Hưng Vũ viết 16:24 ngày 01/10/2018

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

Khoa NTA viết 16:30 ngày 01/10/2018

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);
...
Bài liên quan
0