01/10/2018, 16:13

Function thay thế cho fflush(stdin)?

mình có môt đoạn code thế này, mình đang học cấp phát động để tạo mảng với struct, đoạn code dưới là để nhạp vào các họ tện người thôi

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    char* first_name;
    char* last_name;
}Person;

 int num_people = 0;
    printf("how many people are there?
");
    scanf("%d",&num_people);
    fflush(stdin);
    Person* person = NULL;
    person = calloc(num_people, sizeof(Person));
    person->first_name = calloc(num_people, sizeof(char));
    person->last_name = calloc(num_people, sizeof(char));
    if(person != NULL) {
        for(int i = 0; i < num_people; ++i) {
            printf("nguoi thu %d
", i + 1);
            printf("last name : ");
            gets(person[i].last_name); fflush(stdin);
            printf("first name : ");
            gets(person[i].first_name); fflush(stdin);
        }
    }
    else
        printf("failed to get memories
");
    return 0;
}

dù đã dùng fflush(stdin) bao nhiêu lần nó vẫn bị cái lỗi trôi lệnh, mò ra mới biết ffush(stdin) k phải standard, mọi người có cái hàm nào có thể xóa được buffer thì cho mình biết với. Thanks trước nha.
P/s: đừng đưa cho mình hàm cin.ignore nha, mình đang học c, code ở trên cũng là code c thôi có biết gì về c++ đâu, search thì toàn thấy cin.igonre T_T

newbie viết 18:23 ngày 01/10/2018

mình có đặt một cái fflush(stdin) ở sau cái scanf("%d",&num_people) rồi mà, còn cái fflush(stdin) sau gets là do mình muốn nói về cái "dù đã dùng fflush(stdin) bao nhiêu lần nó vẫn bị cái lỗi trôi lệnh " còn về ++i với i++ đúng là khác nhau nhưng trong trường hợp này nó không ảnh hưởng gì đến chương trình.
.

newbie viết 18:14 ngày 01/10/2018

ép kiểu gì bạn ?, hàm calloc nó cần gì cái ép kiểu đâu

newbie viết 18:20 ngày 01/10/2018

ép kiểu thành pointer?, cái person mình khái báo nó là pointer kiểu Person ở dòng trên rồi mà, co thêm vào nó cũng k giải quyết được gì

newbie viết 18:20 ngày 01/10/2018

hm trong bộ tài liệu mình học nó không ghi gì về cái vụ ép kiểu này cả, nó nói malloc với calloc trả về một pointer kiêu void* có thể trỏ đến bất kỳ type nào, mình đã thử và thấy k có vấn để gì, tại sao nó lại như vậy nhỉ.
p/s mình đã thử ép kiêu nhưng vẫn khong được

newbie viết 18:24 ngày 01/10/2018

vậy sẽ có gì khác nhau giứa calloc, malloc để yên không ép kiểu và có ép kiều

newbie viết 18:21 ngày 01/10/2018

last_name với first _name là hai mảng ký tự, mảng bản chất là 1 pointer trỏ đến cái phần tử đầu tiên của mảng thế nên nó có thể nhận một giá trị là một địa chỉ (theo mình biết thì là thế ), nếu k phải vậy thì mình nên ghi lại cái -> thế nào đây ?

newbie viết 18:29 ngày 01/10/2018

" dòng truy xuất đến thành phần trong struct đấy " là ntn vậy bạn, mình cũng ép kiểu hai cái biến name thành char * rồi mà vẫn không được, và nếu không ép keieru malloc, calloc có thể gây ra lỗi gì không

newbie viết 18:14 ngày 01/10/2018

ở code của bạn, mình vận không hiểu cái đoạn này làm thế này thì chằng phải ta sẽ cấp phát bộ nhớ cho từng phan tu trong mảng sao, không biết mình sai ở đâu vậy

for(int i = 0; i < num_people; ++i){
    	
    person[i].first_name =(char*) calloc(90, sizeof(char));
    person[i].last_name = (char*)calloc(90, sizeof(char));
    }

và nếu mình thay đoạn code trên cái này thì chương trình sẽ lại bị lỗi, vậy thì mình bị sai kiến thức ở cái đoạn này bạn có thẻ chỉ ra mình sai ở đâu không. Mình học cấp phát động vs struct từ video này bắt đầu từ cái phút 12, anh cũng có đoạn code tương tự thế này và nó cứ run mà chả có lỗi gì

person->first_name = (char*)calloc(30, sizeof(char));
person->last_name = (char*)calloc(30, sizeof(char));

mình biết từ đầu đến giờ bạn đã giúp mình rất nhiểu nhưng lúc này mình thực sự rất hoang mang, mình cứ tưởng đã rành về cấp phát động rồi thế mà giờ hóa ra lại toàn ngộ nhận. Nếu bạn có thể giúp mình thì thật tốt quá, mình thật sự cảm ơn.
newbie viết 18:17 ngày 01/10/2018

mình hiểu đoạn code của bạn rồi, nhưng vẫn còn một thắc mắc
nếu mình code thế này, mình cấp phát luôn cho hai cai con trỏ name của tất cả các cái person 30 * num_people * sizeof(char) (bytes) vì mỗi cái first_name, last_name sẽ có khoảng 30 phấn tử vậy với n người ta sẽ cần n * 30 (bytes) cho tất cả last_name và first_name vậy tại sao nó lại vẫn error nhỉ

person->first_name = (char*)calloc(30 * num_people, sizeof(char));
person->last_name = (char*)calloc(30 * num_people, sizeof(char));
newbie viết 18:26 ngày 01/10/2018

thanks, bạn mình hiểu rồi, vậy mà mình cứ tưởng viết thế kia là cáp phát cho tất cả cái first_name, last_name trong tất cả pt mảng person.

Bài liên quan
0