2013-02-27 30 views
6

Tôi đang cố đọc từ đầu vào tiêu chuẩn. Dòng đầu tiên là số dòng mà tôi sẽ đọc. Các dòng mà tôi đọc tiếp theo sẽ được in lại. Đây là mã:cin.get() trong vòng lặp

#include <iostream> 

using namespace std; 

int main() 
{ 
    int n; 
    cin >> n; 
    for (unsigned int i = 0; i < n; ++i) 
    { 
     char a[10]; 
     cin.get (a, 10); 
     cout << "String: " << a << endl; 
    } 
    return 0; 
} 

Khi tôi chạy và cung cấp số dòng, chương trình sẽ thoát. Tôi đã không tìm ra những gì đang xảy ra, vì vậy tôi đã quyết định hỏi nó ở đây.

Xin cảm ơn trước.

+0

Tôi không nghĩ rằng nó sẽ hoạt động như bạn nói..thử một lần nữa. –

+0

đã thử lại - cùng lỗi –

Trả lời

6

Trộn đầu vào định dạng và không định dạng là đầy khó khăn. Trong trường hợp cụ thể của bạn, dòng này:

std::cin >> n; 

tiêu thụ số bạn đã nhập, nhưng rời khỏi '\n' trong luồng đầu vào.

Sau đó, dòng này:

cin.get (a, 10); 

tiêu thụ không có dữ liệu (vì dòng đầu vào vẫn chỉ vào '\n'). Lệnh gọi tiếp theo cũng không tiêu thụ dữ liệu vì cùng lý do, v.v.

Câu hỏi sau đó sẽ trở thành "Làm cách nào để sử dụng '\n'?" Có một vài cách khác nhau:

Bạn có thể đọc một ký tự và vứt nó đi:

cin.get(); 

Bạn có thể đọc toàn bộ một dòng, bất kể chiều dài:

std::getline(std::cin, some_string_variable); 

Bạn có thể bỏ qua phần còn lại của dòng hiện tại:

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

Như một lời khuyên liên quan, tôi sẽ không bao giờ sử dụng std::istream::get(char*, streamsize). Tôi sẽ luôn thích: std::getline(std::istream&, std::string&).

+0

cảm ơn, đã hoạt động –

2

Thêm cin.get() trước cin.get(a, 10) sẽ giải quyết vấn đề của bạn vì nó sẽ đọc dòng cuối còn lại trong luồng đầu vào.

+0

cảm ơn, điều đó đã giúp –

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