Chuyển đến nội dung chính

Hàm Gets() Trong C++

Trong bài viết này chúng ta sẽ tìm hiểu về hàm gets() trong C / C++. Đây là một hàm được sử dụng để đọc các 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<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.

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

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

Hàm gets() được sử dụng để đọc các ký tự từ stdin và lưu trữ chúng cho đến khi tìm thấy ký tự dòng mới. Hàm get () không cung cấp hỗ trợ để ngăn chặn tràn bộ đệm nếu chuỗi đầu 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ẽ yêu cầu bạn nhập vào từ bàn phím.

Cú Pháp Hàm Gets() Trong C++
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() 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ả.

Ví Dụ Hàm Gets() Trong C++
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 & C++

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

PHP Code:

#include <stdio.h>
 
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 <iostream.h>
 
struct sinhvien
{
    char hoten[50];
    char ngaysinh[20];
    float cannang;
};
 
void Xuat1SV(sinhvien x)
{
    cout<<"Ten Sinh Vien: "<<x.hoten<<endl;
    cout<<"Ngay sinh: "<<x.ngaysinh<<endl;
}
void Nhap1SV(sinhvien &x)
{
     
    float cn;
    cout<<"Ten Sinh Vien: ";
    cin.getline(x.hoten,50);
 
    cout<<"Ngay sinh: ";
    cin.getline(x.ngaysinh,20);
     
    cout<<"Can nang: ";
    cin>>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 "<<i+1<<endl<<"---------------------------"<<endl;
        Nhap1SV(dssv[i]);
        cout<<endl;
    }
}

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++
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ư 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;

Kết quả sau khi chèn cin.ignore();

PHP Code:

#include <iostream.h>
 
struct sinhvien
{
    char hoten[50];
    char ngaysinh[20];
    float cannang;
};
 
void Xuat1SV(sinhvien x)
{
    cout<<"Ten Sinh Vien: "<<x.hoten<<endl;
    cout<<"Ngay sinh: "<<x.ngaysinh<<endl;
}
void Nhap1SV(sinhvien &x)
{
     
    float cn;
    cout<<"Ten Sinh Vien: ";
    cin.getline(x.hoten,50);
 
    cout<<"Ngay sinh: ";
    cin.getline(x.ngaysinh,20);
     
    cout<<"Can nang: ";
    cin>>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 "<<i+1<<endl<<"---------------------------"<<endl;
        Nhap1SV(dssv[i]);
        cout<<endl;
    }
}

Kết quả sau khi chèn fflush(stdin);

PHP Code:

#include <stdio.h>
 
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() 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);
}
Bài Tập Về Hàm Gets() Trong C++
Bài Tập Về Hàm Gets() Trong C++

 

The post Hàm Gets() Trong C++ first appeared on Techacademy.



Nhận xét

Bài đăng phổ biến từ blog này

Hướng Dẫn Cài Đặt Python Trên Máy Tính?

Python là một ngôn ngữ lập trình phổ biến và được sử dụng rộng rãi trong lĩnh vực phát triển phần mềm và khoa học dữ liệu. Để bắt đầu sử dụng Python trên máy tính của bạn, bạn cần cài đặt nó. Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách cài đặt Python trên máy tính một cách dễ dàng. I. Cài Đặt Python Trên Vscode Python là một ngôn ngữ lập trình phổ biến và VS Code là một trình soạn thảo mã nguồn được ưa chuộng. Kết hợp cả hai, bạn có thể tận dụng lợi ích của cả hai công cụ để phát triển ứng dụng Python một cách hiệu quả. Trong bài viết này, chúng tôi sẽ hướng dẫn cách cài đặt Python trên VS Code. Bước 1: Cài đặt VS Code Trước khi bắt đầu, bạn cần cài đặt VS Code trên máy tính của mình. Truy cập trang web vscode.com, tải xuống phiên bản phù hợp với hệ điều hành của bạn và làm theo hướng dẫn trên màn hình để hoàn tất quá trình cài đặt. Bước 2: Cài đặt Extension Python cho VS Code Sau khi cài đặt VS Code, bạn cần cài đặt extension Python để hỗ trợ phát triển ứng dụng Python t...

Phím Tắt Eclipse Thông Dụng Và Tiện Lợi Nhất ! Đọc Ngay Nếu Bạn Vẫn Đang Dùng Chuột

Việc sử dụng các thao tác click chuột nhiều lần trong Eclipse khiến các coder nhàm chán và tốn thời gian, hãy cải tạo nó bằng các phím tắt trong Eclipse. Dưới đây là danh sách một số những phím tắt thông dụng bạn nên biết. phím tắt eclipse (1) Đầu tiên hãy sử dụng phím tắt Ctrl + Shift + L để hiển thị danh sách các phím tắt trong Eclipse. phím tắt eclipse (2) Danh sách tất cả những phím tắt trong Eclipse bạn có thể áp dụng, được chia thành 12 mục khác nhau tùy thuộc vào tác dụng của phím tắt: 1. Quản lý tập tin và dự án Ctrl + N Tạo dự án mới bằng Wizard Ctrl + Alt + N Tạo dự án , tập tin, lớp, vv Alt + F Mở dự án, tệp, v.v. Ctrl + Shift + R Mở Resource (tệp, thư mục hoặc dự án) Alt + Enter Hiển thị và truy cập các thuộc tính tệp Ctrl + S Save tập tin hiện tại Ctrl + Shift + S Save tất cả các tập tin Ctrl + W Đóng tệp hiện tại Ctrl + Shift + W Đóng tất cả các tệp F5 Làm mới nội dung của phần tử đã chọn bằng hệ thống tệp cục bộ 2. Cửa sổ trình chỉnh sửa F1...

Kiểu Date Trong Java

Date trong Java là 1 trong các class mô tả ngày tháng đầu tiên trong Java. Thật đáng tiếc là hầu hết các cách thức của nó đã lỗi thời, và thay vào đó là dùng các cách thức của java.util.Calendar. Nhưng bạn vẫn có thể dùng java.util.Date để mô tả ngày tháng. 1. Các Lớp Date, Time, Calendar Trong Java Java cung cấp 1 số class liên quan tới thời gian và lịch (Calendar), sau đây là danh sách các class này: Class Mô tả java.util.Date 1 lớp đại diện cho ngày tháng năm và thời gian. Tiếc là hầu hết các cách thức của nó đã bị lỗi thời, khuyến cáo là không nên dùng các cách thức đó, tuy nhiên lớp Date vẫn được dùng rỗng rãi. java.util.concurrent.TimeUnit TimeUnit là 1 Enum mô tả các đơn vị ngày tháng năm và thời gian. java.sql.Date 1 lớp mô tả ngày tháng năm. Thông tin về thời gian bị cắt bỏ. Lớp này thường dùng trong JDBC. java.sql.Time 1 lớp mô tả thời gian (Giờ phút giây, milli giây), và không chứa thông tin ngày tháng năm. Lớp này thường dùng trong...