#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;
}
Sử dụng hàm fgets để nhập struct nhưng khi in bị mất phần tử đầu tiên
1 Like
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:
- Chủ động “ăn” cái
whitespaceđó. -
scanfsucks:
char tmp[30];
fgets(tmp, 30, stdin);
num = atoi(tmp);
@Viet_Hung_Vu: không in 0 vì i đã đượ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?