2012-06-21 32 views
5

Nó có thể không phải là một lỗi, nhưng tôi không biết những gì đang xảy ra. Mục nhập đầu tiên của tôi được lặp lại cho str1 vào lần lặp thứ hai và cũng giống như cách đó. Chỉ lần lặp đầu tiên mới tốt.Đây có phải là lỗi với getline() hay tôi đang làm điều gì sai. Đúng cách để sử dụng getline()?

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 

cout << " \n Enter two words. \n " ; 
char c = 'y'; 
string str; 
string str1; 
while (c == 'y'){ 

    getline(cin,str); 

    getline (cin,str1); 

    cout << " \n\n str : " << str << " str1 : " << str1 ; 
    cout << " \n Continue ? \n " ; 
    cin >> c; 
} 

return 0; 
} 

Đầu ra là:

 
Enter two words. 
hello world 
this is mr 


str : hello world str1 : this is mr 
Continue ? 
y 
hello world 


str : str1 : hello world 
Continue ? 
n 


+2

Sau khi bạn nhấn 'y', bạn có thể nhấn Enter. Bạn nên xem xét phần nào của chương trình đọc dòng mới được tạo khi bạn nhấn Enter đó. – nos

+0

@chris cin là một đối tượng, có thể bạn là nhà điều hành >> –

+0

Chào mừng bạn đến với SO! Cảm ơn bạn đã cung cấp một chương trình ngắn hoàn chỉnh thể hiện vấn đề của bạn. Đó là * rất * hữu ích về phía bạn. Vui lòng xem http://sscce.org để biết thêm thông tin. –

Trả lời

3

Thêm

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

sau khi bạn

cin >> c; 

xem xét đầu vào sau:

dog 
    cat 
    y 
    owl 
    fish 
    n 

Nếu chúng ta xem xét các nhân vật có mặt trong dòng đầu vào cá nhân, chúng ta sẽ thấy:

d o g \n c a t \n y \n o w l \n f i s h \n n \n 

Cuộc gọi đầu tiên getline tiêu thụ dog\n; thứ hai tiêu thụ cat\n, để lại này:

y \n o w l \n f i s h \n n \n 

Cuộc gọi đầu tiên cin >> c chỉ ynhưng không phải là xuống dòng tiếp theo tiêu thụ, để lại này:

\n o w l \n f i s h \n n \n 

Bây giờ, vui vẻ bắt đầu: Điều gì sẽ xảy ra trong suốt cuộc gọi tiếp theo tới getline? Tại sao nó đọc lên đến dòng mới tiếp theo, tất nhiên. Vì vậy, cuộc gọi tiếp theo tới số getline trả về dòng trống và lá owl... trong luồng đầu vào.

Giải pháp, như tôi đã nêu ở trên, là sử dụng phần còn lại của dòng đầu vào (bây giờ vô dụng).

+0

Cảm ơn, tôi đã suy nghĩ cùng một điều. Bạn xác nhận nó cho tôi. Đối với giải pháp, tôi xóa bộ đệm cin bằng cách sử dụng ignore(). Nó vẫn không hoạt động. Coz, tôi đã đặt nó ở vị trí sai, tức là trước khi cin >> c.(Nó là một phần của dự án, vì vậy có một cin >> năm trước khi tôi chấp nhận sự lựa chọn.) – ani

1

Như cướp nói.

Nhưng một sửa chữa thay thế trông đẹp hơn:

// change 
char c = 'y'; 
.... 
while (c == 'y'){ 
.... 
    cin >> c; 

// Into 
std::string c = "y"; 
.... 
while (c == "y"){ 
.... 
    std::getline(cin, c); 

Khi giao dịch với hướng dẫn sử dụng đầu vào bạn nên cẩn thận khi sử dụng các toán tử >> vì điều này sẽ luôn luôn rời khỏi '\ n' trên đầu vào. Điều đó có nghĩa là bạn có thể sử dụng một phương thức để lấy ra ký tự '\ n' (getline()) hoặc bạn có thể tự xóa nó sau đó (ignore()).

+0

Cảm ơn, Nhìn vào đoạn này tôi tìm thấy đúng vị trí để bỏ qua() cin. :-) – ani

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