Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 14 kết quả

Đề tài: lỗi trôi mất ở hàm getline - giúp em với

  1. #1
    Ngày gia nhập
    11 2008
    Bài viết
    0

    Mặc định lỗi trôi mất ở hàm getline - giúp em với

    Các anh chị coi giùm em đoạn mã dưới đây. Khi em nhập mssv là 1234567 thì nó trôi mất cin.getline(hoten, 80) của em. Hok hiểu tại sao luôn.
    PHP Code:
    #include <iostream.h>
    struct SV {
        
    char mssv[8], hoten[80], lop[10];
        
    float diemtb;
    };
    void nhapSV(SV &a);
    void xuatSV(SV a);
    void main()
    {
        
    SV a;
        
    nhapSV (a);
        
    xuatSV (a);
        
    }

    void nhapSV(SV &a)
    {
        
    cout << "-------------------------"<<endl;
        
    cout << "MSSV: ";
        
    cin.getline (a.mssv8);
        
    cout << "Ho ten: ";
        
    cin.getline (a.hoten80);
        
    cout << "Lop: ";
        
    cin.getline (a.lop10);
        
    cout << "-------------------------" << endl;
    }
    void xuatSV(SV a)
    {
        
    cout << "-------------------------" << endl;
        
    cout << "MSSV: " << a.mssv << endl;
        
    cout << "Ho ten: " << a.hoten << endl;
        
    cout << "Lop : " << a.lop << endl;
        
    cout << "-------------------------" << endl;
        


  2. #2
    Ngày gia nhập
    10 2008
    Bài viết
    258

    bạn cho dòng này vào trước mỗi getLine()
    cin.ignore();

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

    Khi bạn khai báo Mã Số Sinh Viên là:
    char mssv[8] điều này có nghĩa là độ dài tối đa của chuỗi này là 7 mà thôi, vì bạn phải trừ hao có 1 ký tự NULL ở cuối chuỗi.
    Nếu bạn muốn độ dài thực sự của mssv là 8 thì bạn phải khai báo là
    char mssv[8+1]
    hoặc
    char mssv[9]
    Cái số 1 dư đó là để dành cho ký tự NULL cuối mỗi chuỗi. (ký hiệu này là bắt buộc phải có, nếu không thì kết quả sẽ khó mà lường trước được).

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

    Trích dẫn Nguyên bản được gửi bởi thansautk Xem bài viết
    bạn cho dòng này vào trước mỗi getLine()
    cin.ignore();
    --> tại sao lại phải ignore(), theo mình biết là getline là nó tự động ignore mà.
    The getline member function is similar to the get function. Both functions allow a third argument that specifies the terminating character for input. The default value is the newline character. Both functions reserve one character for the required terminating character. However, get leaves the terminating character in the stream and getline removes the terminating character.
    --> Mình làm như bạn chỉ thì nó mất kí tự đầu tiên. VD: mssv nhập vào là 1234567, khi in ra chỉ là 234567

  5. #5
    Ngày gia nhập
    11 2008
    Bài viết
    0

    Trích dẫn Nguyên bản được gửi bởi thichgame Xem bài viết
    Khi bạn khai báo Mã Số Sinh Viên là:
    char mssv[8] điều này có nghĩa là độ dài tối đa của chuỗi này là 7 mà thôi, vì bạn phải trừ hao có 1 ký tự NULL ở cuối chuỗi.
    Nếu bạn muốn độ dài thực sự của mssv là 8 thì bạn phải khai báo là
    char mssv[8+1]
    hoặc
    char mssv[9]
    Cái số 1 dư đó là để dành cho ký tự NULL cuối mỗi chuỗi. (ký hiệu này là bắt buộc phải có, nếu không thì kết quả sẽ khó mà lường trước được).
    --> mình khai mssv[8] là mình đã có ý độ dài tối đa của chuỗi là 7 đó bạn. Mình test với 1234567 = 7 kí tự mà.

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

    Mặc định lỗi trôi mất ở hàm getline - giúp em với

    bạn đã cho thử chưa?bạn thử làm xem sao?

  7. #7
    Ngày gia nhập
    09 2008
    Bài viết
    28

    Nếu vậy thì bạn phải khai báo thế này mới đúng:

    cin.getline (a.mssv, 7); // 7 chứ không phải 8!

    hotenlop cũng phải làm như vậy luôn mới đúng.

  8. #8
    Ngày gia nhập
    11 2008
    Bài viết
    0

    Mình hiểu ra rồi. Khi mình khai báo mssv[8] thì nhập đc 7 kí tự + kí tự kết thúc chuỗi. Sau đó mình bấm enter thì '\n' còn nằm trong bộ đệm sẽ làm trôi hàm cin.getline sau đó. Mặc dù getline tự động loại bỏ kí tự kết thúc, nhưng ở đây mình nhập 7 kí tự + '\0', là đủ 8, kí tự '\n' còn nằm trong bộ đệm. Do đó sài cin.getline[8] ko đc, phải là cin.getline[9]. Cám ơn các bạn đã giúp đỡ.

  9. #9
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    cin.getline (a.mssv, 8); tức là nhận 8 kí tự đưa vào chuỗi a.mssv dù bạn có nhập bao nhiêu thì nó cũng chỉ lấy 8 kí tự đầu tiên, và tự động thêm '\0' vào cuối chuỗi.
    Mặc dù getline tự động loại bỏ kí tự kết thúc, nhưng ở đây mình nhập 7 kí tự + '\0', là đủ 8, kí tự '\n' còn nằm trong bộ đệm.
    Mình không có BC để thử, nhưng nếu bạn dùng đúng chuẩn và compiler với g++ or VC++ thì không có vấn đề gì cả với 1234567 mà chỉ có vấn đề khi bạn nhập 8 kí tự trở lên thôi.

    C++ Code:
    1. #include <iostream>
    2. using namespace std;
    3.  
    4. struct SV {
    5.     char mssv[8], hoten[80], lop[10];
    6.     float diemtb;
    7. };
    8. void nhapSV(SV &a);
    9. void xuatSV(SV a);
    10. int main()
    11. {
    12.     SV a;
    13.     nhapSV (a);
    14.     xuatSV (a);
    15.  
    16. }
    17.  
    18. void nhapSV(SV &a)
    19. {
    20.     cout << "-------------------------"<<endl;
    21.     cout << "MSSV: ";
    22.     cin.getline (a.mssv, 8);
    23.     cout << "Ho ten: ";
    24.     cin.getline (a.hoten, 80);
    25.     cout << "Lop: ";
    26.     cin.getline (a.lop, 10);
    27.     cout << "-------------------------" << endl;
    28. }
    29. void xuatSV(SV a)
    30. {
    31.     cout << "-------------------------" << endl;
    32.     cout << "MSSV: " << a.mssv << endl;
    33.     cout << "Ho ten: " << a.hoten << endl;
    34.     cout << "Lop : " << a.lop << endl;
    35.     cout << "-------------------------" << endl;
    36.  
    37. }
    Đã được chỉnh sửa lần cuối bởi QuangHoang : 09-12-2008 lúc 08:18 PM.

  10. #10
    Ngày gia nhập
    11 2008
    Bài viết
    0

    Mình không có BC để thử, nhưng nếu bạn dùng đúng chuẩn và compiler với g++ or VC++ thì không có vấn đề gì cả với 1234567 mà chỉ có vấn đề khi bạn nhập 8 kí tự trở lên thôi.
    --> uhm, mình dùng VC++ nhưng ko dùng using namespace std nên bị như vậy. Mà tại sao mình include <iostream.h> lại bị lỗi nhỉ. Bạn giải thích cho mình chỗ đó với. Mình mới học C++ thôi.
    Đã được chỉnh sửa lần cuối bởi growing : 09-12-2008 lúc 08:35 PM.

Các đề tài tương tự

  1. Bài tập C Lỗi khó hiểu của cin.getline
    Gửi bởi thanhdat99 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 3
    Bài viết cuối: 11-05-2013, 11:53 PM
  2. Hàm getline trên C++| Một vài thắc mắc, mong các bạn giúp đỡ?
    Gửi bởi anhhaibi trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 10
    Bài viết cuối: 24-03-2013, 12:00 PM
  3. Lập trình C++ Lỗi cin.getline();
    Gửi bởi mrtyoffline trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 03-10-2011, 08:59 PM
  4. Phân biệt cin.get() và cin.getline()
    Gửi bởi trungthuan trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 23-07-2010, 10:42 AM
  5. chưa hiểu về nhập dữ liệu vào getline
    Gửi bởi hahakk trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 10-03-2008, 10:09 PM

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