Hỏi về hàm gets() và scanf() trong C

Khi lập trình C, mọi người thường dùng scanf(), gets() hay một hàm nào khác để nhập chuỗi/ kí tự/ số… dữ liệu từ bàn phím ạ? Tại sao ạ?
Em đang gặp 1 vài vấn đề khi sử dụng scanf() và gets(), nhiều nguồn khuyến cáo em không nên sử dụng gets() vì có liên quan đến buffer size gì đó, còn scanf() thì liên quan tới bộ đệm đối với kí tự \n khi Enter ạ!

Cũng không hẳn là không nên, chỉ là nên cẩn thận khi sử dụng thôi.

Còn mình thì nhập chuỗi vẫn sử dụng scanf() như bình thường. Và clear buffer trước khi nhập chuỗi. (Nếu buffer không có gì thì không cần phải clear). Nhưng nếu program của mình có liên quan đến chuỗi thì mỗi lần sử dụng hàm scanf() thì mình sẽ clear buffer ngay (tránh hậu quả khó lường sau này ý mà :smile:).

Với chuỗi không chứa khoảng trắng thì:

int age;
char name[10];
printf("Enter your age: ");
scanf("%d", &age);
while (getchar() != '\n'); // take one by one character from buffer until get the '\n' character. 
printf("Enter your last name: ");
scanf("%s", name);
while (getchar() != '\n');

Với chuỗi chứa khoảng trắng thì vẫn vậy, chỉ là dùng scan set thôi. :slight_smile:

int age;
char fullName[30];
printf("Enter your age: ");
scanf("%d", &age);
while (getchar() != '\n');
printf("Enter your full name: ");
scanf("%[^\n]s", fullName); // take a string until press enter button. Or scan until get '\n' character. 
while (getchar() != '\n');
3 Likes

Em cảm ơn nhiều ạ! ^^

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