2014-11-07 15 views
5

Tôi đang làm việc trong trường và đang đập đầu vào tường ngay bây giờ cố gắng tìm ra lý do tại sao chương trình của tôi không hoạt động như tôi muốn!Vấn đề C++ liên quan đến getline() và vòng lặp

int main(){ 
    string input; 
    char choice; 

    bool getChoice(char); 
    string getInput(); 

    CharConverter newInput; 

    do{ 
     cout << "Please enter a sentence.\n"; 
     getline(cin, input); 

     cout << newInput.properWords(input) << endl; 

     cout << newInput.uppercase(input) << endl; 
     cout << "Would you like to do that again?\n"; 
     cin >> choice; 



    } while (getChoice(choice) == true); 

    return 0; 
} 

Chương trình này hoạt động tốt ở vòng đầu tiên, nhưng tôi gặp sự cố khi getChoice() == true và khối thời gian lặp lại lần thứ hai. Trong vòng lặp thứ hai, chương trình yêu cầu tôi nhập lại câu, nhưng sau đó chỉ cần nhảy tới "Bạn có muốn làm lại không?" mà không cho phép người dùng nhập hoặc xuất kết quả của các hàm properWords() và chữ hoa() thích hợp. Tôi nghi ngờ rằng có điều gì đó về getline mà tôi không hiểu, nhưng tôi vẫn chưa tìm thấy nó thông qua googling của tôi. Bất kỳ trợ giúp nào ngoài đó?

chỉnh sửa: đã xảy ra lỗi trong giải thích ban đầu của tôi.

+0

đầu vào gì bạn đang sử dụng? Nếu có nhiều hơn một dòng trong luồng đầu vào của bạn, getline() sẽ lấy dòng tiếp theo mà không cần đợi thêm đầu vào. – Otaia

+0

Về cơ bản, những gì tôi đang cố gắng làm là cho phép người dùng nhập một câu đầy đủ được chuyển đến hai hàm thành viên. Tôi muốn người dùng có thể nhập một câu mới vào lần lặp tiếp theo ... v.v. – user3468711

+1

Tôi thích câu hỏi này bởi vì chuỗi so với đầu vào char là một trong những điều đi lên rất nhiều người khi họ bắt đầu viết mã bằng C/C++ (hoặc nhiều ngôn ngữ khác cho vấn đề đó). –

Trả lời

5

Điều này là do đọc đầu vào với getline không kết hợp tốt với đọc ký tự đầu vào theo ký tự. Khi bạn nhập ký tự Y/N để cho biết bạn có muốn tiếp tục hay không, bạn cũng nhấn Nhập. Điều này đặt \n vào bộ đệm đầu vào, nhưng >> không lấy nó từ đó. Khi bạn gọi getline, số \n ở ngay đó, vì vậy hàm trả về một chuỗi trống ngay lập tức.

Để khắc phục điều này, hãy choice một std::string, sử dụng getline để đọc nó, và gửi các ký tự đầu tiên getChoice chức năng, như thế này:

string choice; 
... 
do { 
    ... 
    do { 
     getline(cin, choice); 
    } while (choice.size() == 0); 
} while (getChoice(choice[0])); 
+0

Tuyệt vời! Bạn đã làm ngày hôm nay của tôi trở nên thú vị. – user3468711

Các vấn đề liên quan