01/10/2018, 08:30
Vấn đề khó hiểu hàm struct trong C
Đây là code main.h của mình
#include <stdio.h>
#include <stdlib.h>
typedef struct Taikhoan Taikhoan;
struct Taikhoan
{
char ten[20];
char ho[20];
char gioitinh[5];
int tuoi;
};
còn đây là file main.c của mình
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
int main(int argc, char *argv[])
{
Taikhoan nguoidung[2];
int i;
for(i = 1; i < 3; i++)
{
printf("Nguoi choi thu %d
", i);
printf("Nhap ten cua ban vao: ");
scanf("%s",nguoidung[i].ten);
printf("Nhap ho cua ban vao: ");
scanf("%s",nguoidung[i].ho);
printf("Nhap gioi tinh cua ban vao: ");
scanf("%s",nguoidung[i].gioitinh);
printf("Nhap tuoi cua ban vao: ");
scanf("%d",&nguoidung[i].tuoi);
}
return 0;
}
Sau khi ra console nó sẽ thế này

Không hiểu sao “Nhap ho cua ban vao” và “Nhap gioi tinh cua ban vao” lai dính với nhau như vậy @@
Bài liên quan
Cho thêm câu lệnh nhỏ là \n là xuống dòng thôi
không đc bạn ơi nhập scanf ko cần \n mà có \n cũng không hết đc vấn đề trên :))
Chịu khó
getchar() != '\n'
đê với lại dùng scanf cho chuỗi là sai vì scanf thấy space là không đọc nữa.Ideone.com
Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.
ừa hiểu rồi ông, nãy tui cũng test nếu không space thì nó hoạt động ổn, tks ông đã chia sẽ
Cái này trong window dùng fflush(stdin) để xóa bộ nhớ đệm trong linux ko dùng đc cái đó bạn phải dùng __fpurge(stdin); và nhớ khai báo thêm thư viện http://www.nguyenvanquan7826.com/2014/12/19/fflushstdin-trong-ubuntu-linux/
fflush(stdin)
không có nghĩa. VS2015 dẹp luôn rồi.man page cho thớt: http://man7.org/linux/man-pages/man3/fpurge.3.html
Bạn nói sao chứ mình dùng VS 2015 vẫn dùng fflush(stdin) bình thường mà nhỉ?
Nó có chạy được ko bạn
Cái flush này từ đầu là dành cho write stream.
bạn dùng cái while(getchar() !=’\n’) sau mỗi hàm scanf nhe
__fpurge(stdin);
Mình thấy nếu dùng sau
scanf
thì nó chạy, là cứ mỗi lầnscanf
thì sau nó phải dùng__fpurge(stdin);
Giữa các lần
scanf
đâu cần flush bạn mà sửa lại thànhfgets()
nó mới đúng.Bạn thử làm như thế này đi, sẽ thú vị đấy
thêm: %*c trong hàm scanf
Ví dụ:
printf(“Nguoi choi thu %d\n”, i);
printf(“Nhap ten cua ban vao: “);
scanf(”%s%*c”,nguoidung[i].ten);
nó cũng tránh được vấn đề trôi ký tự khi nhập ký tự từ bàn phím. Còn vấn đề nữa đó là cái bài code của bạn mà dùng hàm scanf để nhập tên, họ, giới tính, thì chuỗi ký tự nhập vào ko được phép có khoảng trắng như dấu cách, hoặc tab, hoặc enter vì hàm scanf coi những ký tự này là ký tự kết thúc nhập.do đó thì xảy ra hiện tượng trôi ký tự. Bạn có thể dùng hàm gets hoặc kiểu như dưới đây
int j=0;
While((nguoidung[i].ten[j]=getchar())!=’\n’) j++;
nguoidung[i].ten[j]=’\0’;
OK mình sẽ thử
Cám ơn bạn rất nhiều, bạn là người chịu khó nhất trong tất cả những người chia sẽ kiến thức cho mình vì bạn giải thích rất chi tiết giúp mình dễ hiểu thêm rất nhiều