quang cao hosting

Hướng dẫn xử lý lỗi bỏ qua khi dùng hàm gets và cin.getline trong C & C++

Xem: 11526    Tải: 0   Thảo luận: 0   Mục: C / C++ / MFC   Lĩnh vực: Bán hàng

40 điểm   ( 18 đánh giá ) File đã được kiểm thử

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 khi nhập sinh viên thứ nhất 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 1 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 khi ta nhập 1 ký tự bất kỳ thì nó sẽ gửi vào đâu . Câu trả lời là nếu ta nhập ký tự trong lúc máy dừng chờ trước các 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 .
+ khi 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ó 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 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");
    }
}  

Kết quả sau khi chè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++ Đăng ngày 01-10-2013  Hướng dẫn xử lý lỗi bỏ qua khi dùng hàm gets và cin.getline trong C & C++ 2.2222222222222/10 11526

Thảo luận:

Để bình luận bạn phải đăng nhập thành viên.

File tương tự

Files cùng mục

 
File gợi ý cho bạn
File tải nhiều nhất
Megacode.vn - Thư viện mã nguồn chia sẻ, tải file cho cộng đồng
Copyright © 2013-2021. All rights reserved. Bản quyền thuộc VinaGon
Email: info@vinagon.com
Hotline: 086.924.3838