Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: vấn đề về hàm gets

  1. #1
    Ngày gia nhập
    09 2011
    Bài viết
    16

    Mặc định vấn đề về hàm gets

    Mình có đoạn code này
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    void main()
    {
    	char x[5];
    	do{fflush(stdin);gets(x);}while(strlen(x)>4);//nhập vào khi nào x nhỏ hơn 5 ký tự
    	puts(x);
    	getch();
    }
    khi nhập đúng yêu cầu thì không sao
    còn nhập lớn hơn 5 ký tự thì vẫn in ra x được nhưng lại mắc lỗi tràn dữ liệu ai giải thích giùm tui và cách khắc phục được không ?

  2. #2
    Ngày gia nhập
    09 2010
    Nơi ở
    Hà Nôi
    Bài viết
    464

    Trích dẫn Nguyên bản được gửi bởi vipzero Xem bài viết
    Mình có đoạn code này
    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    #include<iostream>
    using namespace std;
    void main()
    {
    	char x[5];
    	do{fflush(stdin);gets(x);}while(strlen(x)>4);//nhập vào khi nào x nhỏ hơn 5 ký tự
    	puts(x);
    	getch();
    }
    khi nhập đúng yêu cầu thì không sao
    còn nhập lớn hơn 5 ký tự thì vẫn in ra x được nhưng lại mắc lỗi tràn dữ liệu ai giải thích giùm tui và cách khắc phục được không ?
    Dĩ nhiên bạn khai báo char x[5];
    mà khi gets(x) người ta nhâp nhiều kí tự hơn thì lỗi chứ còn gì.

  3. #3
    Ngày gia nhập
    09 2011
    Bài viết
    16

    Trích dẫn Nguyên bản được gửi bởi dehin Xem bài viết
    Dĩ nhiên bạn khai báo char x[5];
    mà khi gets(x) người ta nhâp nhiều kí tự hơn thì lỗi chứ còn gì.
    Nhập nhiều hơn nhưng tui đã cho nhập lại rồi! :(

  4. #4
    Ngày gia nhập
    11 2010
    Bài viết
    589

    Bạn khai báo cho x là mảng char 5 phần tử, tức là HDH sẽ cấp phát cho mảng x vùng nhớ có địa chỉ từ x -> x+4. Khi nhập vào chuỗi quá dài thì hàm gets sẽ ghi giá trị vào các địa chỉ từ x -> x+n, n > 4. Mà có vùng nhớ này nhiều khả năng là chưa được cấp phát, nên việc truy cập vào nó gây lỗi tràn.
    Trong nhiều trường hợp khác, có thể không gây ra lỗi tràn vì vùng nhớ đó thuộc biến khác => giá trị của biến đó bị thay đổi. Cái này còn nguy hiểm hơn vì đây là lỗi không hiện ra ngay trước mặt.

    Ngoài lề: hacker có thể sử dụng lỗi tràn bộ nhớ này để bắt chương trình thực hiện một đoạn mã nào đó. => rất nguy hiểm.
    Vì vậy nên bất cứ quyển sách hay diễn đàn nào người ta cũng khuyến cáo không nên dùng hàm gets. Nhiều trình dịch cũng có cảnh báo khi biên dịch những mã nguồn có sử dụng hàm này, thay vào đó sử dụng hàm fgets.

    Khắc phục như sau:
    Thay đoạn nhập dữ liệu thành:
    fgets(x,5,stdin);
    Và bỏ vòng lặp đi, không cần nữa.

  5. #5
    Ngày gia nhập
    09 2011
    Bài viết
    16

    Trích dẫn Nguyên bản được gửi bởi boss14420 Xem bài viết
    Ngoài lề: hacker có thể sử dụng lỗi tràn bộ nhớ này để bắt chương trình thực hiện một đoạn mã nào đó. => rất nguy hiểm.
    Vì vậy nên bất cứ quyển sách hay diễn đàn nào người ta cũng khuyến cáo không nên dùng hàm gets. Nhiều trình dịch cũng có cảnh báo khi biên dịch những mã nguồn có sử dụng hàm này, thay vào đó sử dụng hàm fgets.

    Khắc phục như sau:
    Thay đoạn nhập dữ liệu thành:
    fgets(x,5,stdin);
    Và bỏ vòng lặp đi, không cần nữa.
    thanks bạn rất nhiều.Mà làm sao hacker biết mình dùng hàm nào được :-/

  6. #6
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Mặc định vấn đề về hàm gets

    @ vipzero : Cái đó bạn làm nhiều sẽ ngộ
    Đứng trên phương diện hacker hay ko hacker gì gì thì cũng thế. Chương trình có lỗi thì nó mang nguy hiểm tiềm ẩn, sẽ ... vỡ mồm vào một ngày đẹp trời
    Hackers cũng là người của CNTT đấy bạn, cái độ trâu và khủng về viết code của họ rất dễ sợ. Chứ ko phải là ... down tool hack trên mạng về rồi hack game này nọ tihf được gọi là hacker
    Um Mani Padme Hum...!!

  7. #7
    Ngày gia nhập
    02 2010
    Bài viết
    0

    char x[5] tữc là dùng 4 ô nhớ để lưu còn 1 ô để lưu kí tự NULL lên nhập 5 kí tự sẽ bị tràn bộ nhớ

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn