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

Đề tài: Lỗi cin.getline();

  1. #1
    Ngày gia nhập
    10 2010
    Bài viết
    19

    Mặc định Lỗi cin.getline();

    thật không thể tìm ra lỗi trong hàm nhập trong lớp teacher????
    mong mọi người chỉ giúp mình với.

    cin.getline(hoten,30) ko vào trong biến chuỗi...

    PHP Code:
    #include<iostream.h>
    #include <conio.h>
    #include <string.h>
    #include <iomanip.h>
    class date
    {
        
    int ngay,thang,nam;
        public:
        
    friend istreamoperator>>(istreamis,datex)
        {
            
    cin>>x.ngay>>x.thang>>x.nam;
            return 
    is;
        }
        
    friend ostreamoperator<<(ostreamos,datex)
        {
            
    cout<<x.ngay<<"/"<<x.thang<<"/"<<x.nam;
            return 
    os;
        }
    };
    //class root
    class person
    {       //protected :
        
    charhoten;
        
    chardiachi;
        
    charemail;
        
    date ngaysinh;
        public:
        
    person();
        
    void nhap();
        
    void xuat();
        
    int tinhluong();
    };
    person::person()
    {
        
    hoten=NULL;
        
    email=NULL;
        
    diachi=NULL;
    }
    void person::nhap()
    {                  
    //char* tam;
        
    cout<<"\nnhap vao ten ";
        
    cin.getline(hoten,30); // LOI O DAY, khong ghi vao bien duoc
            //cin.getline(tam,30);hoten=strdup(tam);
        
    cout<<"\nnhap dia chi ";
        
    cin.getline(diachi,30); // LOI O DAY, khong ghi vao bien duoc
        
    cout<<"\nnhap vao email ";
        
    cin.getline(email,30); // LOI O DAY, khong ghi vao bien duoc
        
    cout<<"\nnhap vap ngay thang nam sinh ";
        
    cin>>ngaysinh;
    }
    void person::xuat()
    {
        
    cout<<"\nhoten:"<<hoten<<"\nngaysinh:"<<ngaysinh<<"\ndiachi"<<diachi<<"\nemail:"<<email;
    }
    int person::tinhluong()
    {
        return 
    0;
    }


    //class giao vien
    class teacher:public person
    {
        
    charchuyenmon;
        
    int sotiet,tienhchuan;
        public:
        
    teacher();
        
    int tinhluong();
        
    void giaitri();
        
    void xuat();
        
    void nhap();
    };
    teacher::teacher():person()
    {
        
    chuyenmon=NULL;
        
    sotiet=tienhchuan=0;
    }
    void teacher::nhap()
    {
        
    person::nhap();
        
    cout<<"\nnhap chuyen mon ";
        
    cin.ignore(1);
        
    cin.getline(chuyenmon,30); // LOI O DAY, khong ghi vao bien duoc
        
    cout<<"\nnhap so tiet ";
        
    cin>>sotiet;
        
    cout<<"\nnhap tien gio chuan ";
        
    cin>>tienhchuan;
    }
    void teacher::xuat()
    {
        
    person::xuat();
        
    cout<<"\nchuyen mon: "<<chuyenmon<<"\nso tiet: "<<sotiet<<"\ntien h chuan:"<<tienhchuan;

    }
    void teacher::giaitri()
    {
        
    cout<<"\n Danh tennis"  ;
    }
    int teacher::tinhluong()
    {
        return 
    tienhchuan*sotiet;
    }
    void main()
    {       
    clrscr();
        
    person *a;
        
    teacher b;
        
    b.nhap();
        
    b.xuat();
        
    b.giaitri();
        
    getch();

    Đã được chỉnh sửa lần cuối bởi mrtyoffline : 03-10-2011 lúc 03:28 PM.
    Mình chỉ mới học LTHDT dùng c++ thôi, nên nói gì sai, hay hỏi gì ngớ ngẫn thì mọi người bỏ qua cho mình nhé

  2. #2
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Chưa cấp phát bộ nhớ, bạn đọc vào bộ nhớ tại địa chỉ 0 (NULL) thì làm sao được
    Nếu không muốn cấp phát động thì khai báo gán bộ nhớ tĩnh đi (char hoten[30], ...) rồi bỏ mấy cái khởi tạo = NULL đi

  3. #3
    Ngày gia nhập
    10 2010
    Bài viết
    19

    Trích dẫn Nguyên bản được gửi bởi fbchicken Xem bài viết
    Chưa cấp phát bộ nhớ, bạn đọc vào bộ nhớ tại địa chỉ 0 (NULL) thì làm sao được
    Nếu không muốn cấp phát động thì khai báo gán bộ nhớ tĩnh đi (char hoten[30], ...) rồi bỏ mấy cái khởi tạo = NULL đi
    vậy sao mình dùng biến tạm để lưu trước, sau đó strdup() thì được vậy bạn

    trong phần mình chú thích // í

    mình vừa thử thay hoten=""; thì cin.getline(hoten,30) hoạt động tốt...bạn hiểu vấn đề này không? nếu biết thì chỉ mình với
    Đã được chỉnh sửa lần cuối bởi mrtyoffline : 03-10-2011 lúc 03:45 PM.
    Mình chỉ mới học LTHDT dùng c++ thôi, nên nói gì sai, hay hỏi gì ngớ ngẫn thì mọi người bỏ qua cho mình nhé

  4. #4
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Cái này trên forum hầu như ngày nào cũng có người nói suốt rồi :|

    Chạy được không có nghĩa là đúng. Không cấp phát bộ nhớ mà sử dụng là sai. Tùy môi trường và trình biên dịch mà nó sẽ có thể chạy được hay không, nhưng dù có chạy được thì cũng không ổn định và có thể gây nhiều nguy hiểm chết người. Trên môi trường windows thì thường quản lý bộ nhớ khá là nghiêm, bạn dùng vậy sẽ bị crash với lỗi access violation ngay lập tức.

    Vậy bạn đừng tìm hiểu tại sao làm như thế kia lại chạy được, mà hãy tìm hiểu cách luôn cấp phát bộ nhớ trước khi sử dụng đi (và dùng xong thì giải phóng nó đi). Nếu không thì khai báo các biến trên bằng mảng tĩnh đỡ phải cấp phát hay giải phóng (char hoten[30]...)

  5. #5
    Ngày gia nhập
    10 2010
    Bài viết
    19

    Trích dẫn Nguyên bản được gửi bởi fbchicken Xem bài viết
    Cái này trên forum hầu như ngày nào cũng có người nói suốt rồi :|

    Chạy được không có nghĩa là đúng. Không cấp phát bộ nhớ mà sử dụng là sai. Tùy môi trường và trình biên dịch mà nó sẽ có thể chạy được hay không, nhưng dù có chạy được thì cũng không ổn định và có thể gây nhiều nguy hiểm chết người. Trên môi trường windows thì thường quản lý bộ nhớ khá là nghiêm, bạn dùng vậy sẽ bị crash với lỗi access violation ngay lập tức.

    Vậy bạn đừng tìm hiểu tại sao làm như thế kia lại chạy được, mà hãy tìm hiểu cách luôn cấp phát bộ nhớ trước khi sử dụng đi (và dùng xong thì giải phóng nó đi). Nếu không thì khai báo các biến trên bằng mảng tĩnh đỡ phải cấp phát hay giải phóng (char hoten[30]...)
    ùa thank bạn, mình dùng tĩnh cho khỏe. hi

    Cho mình hỏi: char* a;
    a là con trỏ trỏ hay là 1 biến thuộc kiểu chuỗi???? thằng bạn mình cứ bảo char thêm dấu * là kiễu chuỗi.
    Đã được chỉnh sửa lần cuối bởi mrtyoffline : 03-10-2011 lúc 09:14 PM.
    Mình chỉ mới học LTHDT dùng c++ thôi, nên nói gì sai, hay hỏi gì ngớ ngẫn thì mọi người bỏ qua cho mình nhé

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

  1. Lệnh tương đương với getline() trong C++ ??
    Gửi bởi kwideur trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 11-10-2013, 08:41 AM
  2. 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
  3. Lập trình C hỏi hàm getline trong c
    Gửi bởi blackhorse trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 01-01-2012, 03:09 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. [VC] tại sao hàm cin.getline này không dung đuọc
    Gửi bởi trieuanhl trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 6
    Bài viết cuối: 27-02-2009, 11:12 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