Hàm gets() trong c là một trong những hàm thông dụng, hôm nay chúng ta sẽ tìm hiểu cụ thể ý nghĩa các tham số và cách dùng hàm gets của Tekmonk nhé.
Hàm gets() trong C là gì?
Hàm gets() là hàm có sẵn trong thư viện cstdio, vì vậy trước khi sử dụng nó các bạn nhớ khai báo thư viện đã nhé: #include<cstdio>.
Hàm char *gets(char *str) trong Thư viện C chuẩn đọc một dòng từ stdin và lưu trữ nó bên trong chuỗi được trỏ bởi str. Nó dừng khi bắt gặp end-of-file hoặc ký tự newline (dòng mới) được đọc.
Hàm gets() khác hàm scanf() ở chỗ là hàm này chấp nhận các chuỗi có khoảng trống.
Cú pháp hàm gets() trong C
Dưới đây là phần khai báo cho hàm gets() trong C:
char *gets(char *str)
Tham số
str — Đây là con trỏ tới mảng các char nơi chuỗi được lưu trữ.
Trả về giá trị
Hàm này trả về str nếu thành công, và NULL nếu có lỗi hoặc xuất hiện End-Of-File, trong khi không có ký tự nào đã được đọc.
Ví dụ
Chương trình C sau minh họa cách sử dụng của hàm gets() trong C. Bạn sẽ thấy rằng hàm gets() chấp nhận chuỗi có chứa khoảng trống, không giống như hàm scanf():
#include <stdio.h>
int main()
{
char str[50];
printf("Nhap mot chuoi: ");
gets(str);
printf("Ban vua nhap chuoi: %s", str);
return(0);
}
Biên dịch và chạy chương trình C trên sẽ cho kết quả:
Chương trình C sau minh họa cách sử dụng của hàm gets() trong C. Bạn sẽ thấy rằng hàm gets() chấp nhận chuỗi có chứa khoảng trống, không giống như hàm scanf():
#include <stdio.h>
int main()
{
char str[50];
printf("Nhap mot chuoi: ");
gets(str);
printf("Ban vua nhap chuoi: %s", str);
return(0);
}
Biên dịch và chạy chương trình C trên để xem kết quả.
Hướng Dẫn Xử Lý Lỗi Bỏ Qua Khi Dùng Hàm Gets Và Cin.Getline Trong C & C++
Chắc các bạn sẽ thấy rằng sau lúc nhập sinh viên đầu tiên nó bỏ qua bước nhập tên sinh viên 2 mà nhảy tới ngày sinh luôn
Điều này đc giải thích như sau:
Khi bạn nhập một ký tự từ bàn phím thì ký tự ấy sẽ được chuyển vào 1 trong 2 nơi : bộ đệm bàn phím hoặc tệp stdin . Làm sao biết lúc ta nhập 1 ký tự bất kỳ thì nó sẽ gửi vào đâu. Câu trả lời là trường hợp ta nhập ký tự trong lúc máy dừng chờ trước những hàm scanf , gets , getchar thì máy sẽ gửi ký tự vào tệp stdin. Nếu ko phải 3 hàm ấy thì là vào bộ đệm bàn phím . Tệp stdin có tính chất như sau :
+ Nếu trên stdin có dư dữ liệu ( tức là bạn bấm nhiều phím bất kỳ ) thì các hàm trên sẽ nhận được 1 phần dữ liệu mà chúng yêu cầu . Các ký tự còn lại vẫn nằm trên stdin .
+ lúc stdin chưa đủ dữ liệu thì máy sẽ chờ cho đến khi người dùng nhập đủ dữ liệu vào .
khi bạn nhập như sau : 45 và bấm ENTER cho hàm cin thì ký tự 45 sẽ được gán cho thuộc tính cân nặng . Nhưng ký tự ENTER vẫn còn lưu lại trên stdin hoặc bộ đệm và hàm cin>> (scanf)sẽ nhận nó bởi vậy sẽ làm trôi hàm cin.getline (gets) đi . Dù bạn rất muốn nhập cái gì đó cho chuỗi hoten nhưng cũng bó tay .
Thế thì cách giải quyết chính là làm sạch tệp stdin và bộ đệm buffer đi
Đối với thư viện stdio.h bị lỗi với gets thì ta chèn
PHP Code: fflush(stdin); Sau hàm nhập số liền kề với gets sau nó
Đối với thư viện iostrem.h bị lỗi cin.getline thì ta chèn
PHP Code: cin.ignore(); Sau hàm nhập số trước cin.getline() liền kề sau nó để xóa bộ đệm đi là ok;
Chương trình C sau minh họa cách sử dụng của hàm gets() trong C. Bạn sẽ thấy rằng hàm gets() chấp nhận chuỗi có chứa khoảng trống, không giống như hàm scanf():
#include <stdio.h>
int main()
{
char str[50];
printf("Nhap mot chuoi: ");
gets(str);
printf("Ban vua nhap chuoi: %s", str);
return(0);
}