#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
đó. -
scanf
sucks:
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