2012-10-02 19 views
12

thể trùng lặp:
Need help with getline()getline() không hoạt động nếu sử dụng sau khi một số đầu vào

getline() không hoạt động, nếu tôi sử dụng nó sau khi một số đầu vào, tức là

#include<iostream> 
using namespace std; 

main() 
{ 
string date,time; 
char journal[23]; 


cout<<"Date:\t"; 
cin>>date; 
cout<<"Time:\t"; 
cin>>time; 

cout<<"Journal Entry:\t"; 
cin.getline(journal,23); 


cout<<endl; 
system("pause"); 
} 

nơi như thể tôi sử dụng getline() trên đầu vào của đầu vào, nó hoạt động tức là

cout<<"Journal Entry:\t"; 
cin.getline(journal,23); 
cout<<"Date:\t"; 
cin>>date; 
cout<<"Time:\t"; 
cin>>time; 

Lý do có thể là gì?

+1

hãy xác định "không hoạt động". Bạn mong đợi kết quả nào và bạn đã đạt được kết quả gì? –

Trả lời

25

Nhân vật được chiết xuất cho đến khi một trong hai (n - 1) nhân vật đã chiết xuất hoặc ký tự khoanh vùng được tìm thấy (đó là dấu phân cách nếu tham số này được chỉ định, hoặc '\ n' khác). Việc trích xuất cũng dừng lại nếu kết thúc tệp đạt được trong chuỗi đầu vào hoặc nếu xảy ra lỗi trong quá trình nhập.

Khi đọc cin.getline() đọc từ đầu vào, có ký tự dòng mới còn lại trong luồng đầu vào, vì vậy nó không đọc chuỗi c của bạn. Sử dụng số gọi cin.ignore() beore getline().

cout<<"Journal Entry:\t"; 
cin.ignore(); 
cin.getline(journal,23); 
+0

Điều gì về 'int' vẫn' \ n' gây ra vấn đề cho 'getline()'? – UnKnown

+0

Đây là điều rất quan trọng và không được đề cập trong nhiều trang web giải thích các chức năng của getline. – ViruMax

2

Bạn không kiểm tra trạng thái luồng. Nhà điều hành khai thác luồng std::cin (operator>>) có thể không thành công. Khi có, luồng được đánh dấu là "xấu" (failbit, badbit hoặc eofbit được đặt). Khi "xấu", tất cả các trích xuất luồng tiếp theo trên luồng đó sẽ không thành công trừ khi bạn xóa trạng thái.

Học cách trở thành một lập trình viên hoang tưởng. Luôn kiểm tra trạng thái của các thao tác nhập được định dạng đó. Bạn có thể, ví dụ ném một ngoại lệ, hoặc in một thông báo lỗi và thoát. Một điều bạn không nên làm là chỉ đơn giản giả định rằng nó hoạt động.

6

Thêm vào những gì @DavidHammen nói:

Các hoạt động khai thác rời khỏi '\n' nhân vật trailing trong dòng. Mặt khác, istream::getline() loại bỏ nó. Vì vậy, khi bạn gọi getline sau một toán tử khai thác, '\n' là ký tự đầu tiên nó gặp và nó dừng đọc ngay tại đó.

Đặt này sau trước khi getline gọi khai thác:

cin.ignore()

Một cách mạnh mẽ hơn của việc đầu vào sẽ là một cái gì đó như thế này:

while (true) { 

    cout<<"Time:\t"; 
    if (cin>>time) { 
     cin.ignore(); // discard the trailing '\n' 
     break; 
    } else { 
     // ignore everything or to the first '\n', whichever comes first 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cin.clear(); // clear the error flags 
     cout << "Invalid input, try again.\n"; 
    } 
} 
Các vấn đề liên quan