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 @@

nguyenlehai viết 10:32 ngày 01/10/2018

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

ntbac.1dream@gmail.com viết 10:41 ngày 01/10/2018

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

rogp10 viết 10:45 ngày 01/10/2018

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.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.

ntbac.1dream@gmail.com viết 10:32 ngày 01/10/2018

ừ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ẽ

pơ phếc viết 10:35 ngày 01/10/2018

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/

rogp10 viết 10:40 ngày 01/10/2018

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

Usually it is a mistake to want to discard input buffers.

Nguyên Vũ viết 10:35 ngày 01/10/2018

g có nghĩa. VS20

Bạn nói sao chứ mình dùng VS 2015 vẫn dùng fflush(stdin) bình thường mà nhỉ?

rogp10 viết 10:46 ngày 01/10/2018

Nó có chạy được ko bạn

Cái flush này từ đầu là dành cho write stream.

huyentrang viết 10:44 ngày 01/10/2018

bạn dùng cái while(getchar() !=’\n’) sau mỗi hàm scanf nhe

ntbac.1dream@gmail.com viết 10:44 ngày 01/10/2018

__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);

rogp10 viết 10:45 ngày 01/10/2018

Giữa các lần scanf đâu cần flush bạn mà sửa lại thành fgets() nó mới đúng.

Son Dang viết 10:33 ngày 01/10/2018

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’;

ntbac.1dream@gmail.com viết 10:32 ngày 01/10/2018

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

Bài liên quan
0