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

Đề tài: Lệnh cin.getline không hoạt động đúng (chuơng trình không báo lỗi)

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

    Unhappy Lệnh cin.getline không hoạt động đúng (chuơng trình không báo lỗi)

    Mình code như sau:
    Code:
    /*
    Viết chương trình nhập vào họ tên, điểm của n học sinh. Xếp loại văn hóa theo cách sau:
    Điểm Xếp loại
    9, 10 Giỏi
    7, 8 Khá
    5, 6 Trung bình
    dưới 5 Không đạt
    */
    #include <iostream>
    using namespace std;
    #define SPT 5
    struct hoso
    {
    	char hoten [40];
    	float diem;
    	char loai[20];
    };
    void main ()
    {
    	hoso hs[SPT];
    	cout<<"Danh sach chua co sv nao.\n";
    	for (int i=0;i<=4;i++)
    	{
    		system("cls");
    		cout<<"Nhap sv thu "<<i<<": \n";
    		cout<<"Ten sv: ";
    		cin.getline(hs[i].hoten,40);
    		cout<<"Diem trung binh: ";
    		cin>>hs[i].diem;
    		if (hs[i].diem>8) strcpy_s(hs[i].loai,"Gioi");
    		else
    			if (hs[i].diem>6) strcpy_s(hs[i].loai,"Kha");
    			else
    				if (hs[i].diem>4) strcpy_s(hs[i].loai,"Trung Binh");
    				else strcpy_s(hs[i].loai,"Yeu");
    	}
    	cout<<"\t\t\t\t\tXEP LOAI VAN HOA\n";
    	cout<<"HO TEN \t\t\t DIEM \t\t\t XEP LOAI\n";
    	for (int j=0;j<=5;j++)
    	{
    		cout<<hs[j].hoten<<" \t\t "<<hs[j].diem<<" \t\t\t "<<hs[j].loai<<"\n";
    	}
    }
    Thắc mắc của mình như sau:
    1. Ở dòng cin.getline(hs[i].hoten,40); khi chạy chuơng trình, ở vòng lặp for thứ nhất nó vẫn chạy đúng, nhưng vòng lặp thứ 2 thì nó bỏ qua lệnh cin.getline mà đòi nhập tiếp "Diem trung binh" luôn. Tại sao lại như vậy???
    2. Mình thấy trong sách có 1 đoạn code (phần danh sách liên kết) như sau:
    Code:
    typedef struct node *NODEPTR;
    struct node 
    {
         int info
         NODEPTR next;
    };
    NODEPTR head;
    Vậy ý nghĩa của dòng đầu tiên là gì? Có phải là định nghĩa con trỏ NODEPTR trỏ tới kiểu struct node, hay là gán tên mới(NODEPTR) cho kiểu struct node để sau này khai báo NODEPTR head thay vì struct node *head ?
    Khi chương trình dịch chạy từ dòng đầu tiên thì "struct node" chưa hề được định nghĩa, tại sao nó vẫn hiểu kiểu cấu trúc này???
    Các bạn giúp mình trả lời những câu hỏi trên nhé. Thanks đã đọc bài...!

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

    Lý do là vì phím enter của bạn nó còn dính trên buffer. Bạn dùng lệnh này
    C++ Code:
    1. cin.ignore(80, '\n')
    sau dòng cin.getline(hs[i].hoten,40); là ok. Nếu vẫn chưa được thì mình sẽ coi lại.

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

    Trích dẫn Nguyên bản được gửi bởi Halen Xem bài viết
    Lý do là vì phím enter của bạn nó còn dính trên buffer. Bạn dùng lệnh này
    C++ Code:
    1. cin.ignore(80, '\n')
    sau dòng cin.getline(hs[i].hoten,40); là ok. Nếu vẫn chưa được thì mình sẽ coi lại.
    Cám ơn bạn đã gợi ý cho mình lệnh cin.ignore(n). Mình đã tìm hiểu và biết lệnh đó xóa n ký tự trong bộ nhớ đệm. Lỗi ở đây đúng như bạn nói là dính Enter trên bộ nhớ, và lần "Enter" cuối cùng là nhập điểm trung bình, vì vậy cin.ignore phải đặt sau cin>>hs[i].diem; chứ không phải sau cin.getline như bạn nói.

    Code:
    cout<<"Diem trung binh: ";
    	cin>>hs[i].diem;
    	cin.ignore(1);
    Sau khi hiểu được vấn đề cũ thì lại xuất hiện vấn đề mới. Mình nhập, xuất được các thông tin cần thiết nhưng lại có thêm nhiều ký tự đặc biệt. Đây là hình mình chụp lại:
    http://i1131.photobucket.com/albums/...1805/Error.jpg
    Có ai bị như vậy chỉ cho mình cách sửa với nhé. Mình dùng VC 2k10, win 7.
    p/s: Còn câu hỏi số 2 bạn giúp mình được không?
    Đã được chỉnh sửa lần cuối bởi Hacker1805 : 01-12-2011 lúc 05:02 PM.

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

    Cái đoạn cin.ignore phải bỏ trước cin.getline mới đúng. Nhưng có vấn đề là nếu trong buff ko có ký tự nào thì phải thêm 1 lần nhấn enter trước nhập tên. Trong trường hợp này thì là lần nhập tên đầu tiên.
    Để giải quyết vấn đề trên thì xem thêm ở đây: http://www.daniweb.com/software-deve...utorials/90228

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

    Trích dẫn Nguyên bản được gửi bởi boss14420 Xem bài viết
    Cái đoạn cin.ignore phải bỏ trước cin.getline mới đúng. Nhưng có vấn đề là nếu trong buff ko có ký tự nào thì phải thêm 1 lần nhấn enter trước nhập tên. Trong trường hợp này thì là lần nhập tên đầu tiên.
    Để giải quyết vấn đề trên thì xem thêm ở đây: http://www.daniweb.com/software-deve...utorials/90228
    Cảm ơn bạn đã reply. mình đã giải quyết được vấn đề đó. Bạn giúp mình câu hỏi số 2 và những ký tự lạ trong hình http://i1131.photobucket.com/albums/...1805/Error.jpg nhé.

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

    Mặc định Lệnh cin.getline không hoạt động đúng (chuơng trình không báo lỗi)

    C Code:
    1. typedef struct node *NODEPTR;
    Câu lệnh này là để định nghĩa kiểu NODEPTR là tương đương với con trỏ trỏ đến cấu trúc node;

    Còn về mấy cái ký tự lạ, bạn chỉ nhập vào 5 hồ sơ nhưng lại in ra đến 6 hồ sơ (phần nhập thì i <= 4, phần xuất thì i <= 5) nên ở cái hồ sơ thứ 6 nó sẽ in ra giá trị ở vùng nhớ kế tiếp vùng nhớ của hồ sơ thứ 5 (vốn là vùng nhớ của biến mang kiểu khác) nên sẽ xuất hiện ký tự lạ.

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

    Trích dẫn Nguyên bản được gửi bởi boss14420 Xem bài viết
    C Code:
    1. typedef struct node *NODEPTR;
    Câu lệnh này là để định nghĩa kiểu NODEPTR là tương đương với con trỏ trỏ đến cấu trúc node;

    Còn về mấy cái ký tự lạ, bạn chỉ nhập vào 5 hồ sơ nhưng lại in ra đến 6 hồ sơ (phần nhập thì i <= 4, phần xuất thì i <= 5) nên ở cái hồ sơ thứ 6 nó sẽ in ra giá trị ở vùng nhớ kế tiếp vùng nhớ của hồ sơ thứ 5 (vốn là vùng nhớ của biến mang kiểu khác) nên sẽ xuất hiện ký tự lạ.
    Mình hiểu rồi. cám ơn bạn rất nhiều...

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. 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
  3. lỗi trôi mất ở hàm getline - giúp em với
    Gửi bởi growing trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 13
    Bài viết cuối: 17-04-2011, 04:46 PM
  4. Kỹ thuật C++ cin.getline không hoạt động được
    Gửi bởi datinh_o0o7 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-02-2011, 07:39 PM
  5. 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

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