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\n", 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 @@

Cho thêm câu lệnh nhỏ là \n là xuống dòng thôi :smile:

không đc bạn ơi :smiley: 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' đê :smiley: với lại dùng scanf cho chuỗi là sai :smiley: vì scanf thấy space là không đọc nữa.

ừa :smiley: 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/

1 Like

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 :smiley:

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ần scanf thì sau nó phải dùng __fpurge(stdin);

Giữa các lần scanf đâu cần flush bạn :smiley: mà sửa lại thành fgets() 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’;

1 Like

OK mình sẽ thử :smiley:
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 :smiley:

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