Hàm Gets() Trong C++ – Techacademy

Trong bài viết này tất cả chúng ta sẽ khám phá về hàm gets ( ) trong C / C + +. Đây là một hàm được sử dụng để đọc những ký tự từ stdin .

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

Hàm char * gets ( char * str ) trong Thư viện C chuẩn đọc một dòng từ stdin và tàng trữ nó bên trong chuỗi được trỏ bởi str. Nó dừng khi phát hiện 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.

Hàm Gets() Trong C++ Là Gì

II. Cú Pháp Hàm Gets ( ) Trong C + +

Hàm gets ( ) được sử dụng để đọc những ký tự từ stdin và tàng trữ chúng cho đến khi tìm thấy ký tự dòng mới. Hàm get ( ) không phân phối tương hỗ để ngăn ngừa tràn bộ đệm nếu chuỗi nguồn vào lớn .
Cú pháp :

char* gets(char* str);

Trong đó:

  • str: Con trỏ đến một mảng ký tự lưu trữ các ký tự từ stdin.

Hàm trả về:

  • Khi thành công, hàm gets() trả về str.
  • Khi thất bại, nó trả về null.

Ví dụ: khi chúng ta muốn yêu cầu người dùng nhập vào họ và tên thì có thể sử dụng hàm gets() kết hợp với cout.

char str[100];
cout << "Nhập vào họ tên của bạn: ";
gets(str);

Như vậy là khi chạy thì chương trình sẽ nhu yếu bạn nhập vào từ bàn phím .
Cú Pháp Hàm Gets() Trong C++

III. Ví Dụ Hàm Gets ( ) Trong C + +

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 ( ) đồng ý chuỗi có chứa khoảng trống, không giống như hàm scanf ( ) :

#include 

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 hiệu quả .
Ví Dụ Hàm Gets() Trong C++

IV. Hướng Dẫn Xử Lý Lỗi Bỏ Qua Khi Dùng Hàm Gets Và Cin. Getline Trong C và C + +

Ví dụ với thư viện stdio. h
PHP Code :

#include 
 
struct sinhvien
{
    char hoten[50];
    char ngaysinh[20];
    float cannang;
};
 
void Xuat1SV(sinhvien x)
{
    printf("Ten Sinh Vien: %s\n",x.hoten);
    printf("Ngay sinh: %s\n",x.ngaysinh);
}
void Nhap1SV(sinhvien &x)
{   
    float cn;
    printf("Ten Sinh Vien: ");
    gets(x.hoten);
 
    printf("Ngay sinh: ");
    gets(x.ngaysinh);
     
    printf("Can nang: ");
    scanf("%f",&cn);
    x.cannang=cn;
      
}
 
void main()
{
    sinhvien dssv[3];
    int i=0;
    //-------Nhap SV
    for (i=0;i<3;i++)
    {      
        printf("Nhap sinh vien thu %d\n----------------------------------------\n",i+1);
        Nhap1SV(dssv[i]);
        printf("\n");
    }
}

Ví dụ với iostream. h
PHP Code :

#include 
 
struct sinhvien
{
    char hoten[50];
    char ngaysinh[20];
    float cannang;
};
 
void Xuat1SV(sinhvien x)
{
    cout<<"Ten Sinh Vien: "<>cn;
    x.cannang=cn;
     
     
 
}
 
 
void main()
{
    sinhvien dssv[3];
    int i=0;
    //-------Nhap SV
    for (i=0;i<3;i++)
    {
         
        cout<<"Nhap sinh vien thu "<
Các bạn chạy thử ví dụ trên nha

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

Hướng Dẫn Xử Lý Lỗi Bỏ Qua Khi Dùng Hàm Gets Và Cin.Getline Trong C & C++

Đ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ư tài liệu ( tức là bạn bấm nhiều phím bất kể ) thì những hàm trên sẽ nhận được 1 phần tài liệu mà chúng nhu yếu. Các ký tự còn lại vẫn nằm trên stdin . + lúc stdin chưa đủ tài liệu thì máy sẽ chờ cho đến khi người dùng nhập đủ tài 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ó vì thế 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 xử lý 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;

Kết quả sau khi chèn cin.ignore ( ) ; PHP Code :
#include 
 
struct sinhvien
{
    char hoten[50];
    char ngaysinh[20];
    float cannang;
};
 
void Xuat1SV(sinhvien x)
{
    cout<<"Ten Sinh Vien: "<>cn;
    x.cannang=cn;
     
    cin.ignore();
 
}
 
 
void main()
{
    sinhvien dssv[3];
    int i=0;
    //-------Nhap SV
    for (i=0;i<3;i++)
    {
         
        cout<<"Nhap sinh vien thu "<
Kết quả sau khi chèn fflush ( stdin ) ;

PHP Code:

#include 
 
struct sinhvien
{
    char hoten[50];
    char ngaysinh[20];
    float cannang;
};
 
void Xuat1SV(sinhvien x)
{
    printf("Ten Sinh Vien: %s\n",x.hoten);
    printf("Ngay sinh: %s\n",x.ngaysinh);
}
void Nhap1SV(sinhvien &x)
{
     
    float cn;
    printf("Ten Sinh Vien: ");
    gets(x.hoten);
 
    printf("Ngay sinh: ");
    gets(x.ngaysinh);
     
    printf("Can nang: ");
    scanf("%f",&cn);
    x.cannang=cn;
    fflush(stdin);
     
 
}
 
 
void main()
{
    sinhvien dssv[3];
    int i=0;
    //-------Nhap SV
    for (i=0;i<3;i++)
    {
         
        printf("Nhap sinh vien thu %d\n----------------------------------------\n",i+1);
        Nhap1SV(dssv[i]);
        printf("\n");
    }
}

V. Bài Tập Về Hàm Gets ( ) Trong 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 ( ) đồng ý chuỗi có chứa khoảng trống, không giống như hàm scanf ( ) :

#include 

int main()
{
   char str[50];

   printf("Nhap mot chuoi: ");
   gets(str);

   printf("Ban vua nhap chuoi: %s", str);

   return(0);
}

Bài Tập Về Hàm Gets() Trong C++