2013-08-25 39 views
6

Tôi đang thực hiện bài tập trong C++ Primer và về cơ bản tôi đang sử dụng câu lệnh chuyển đổi để đếm số lượng nguyên âm trong văn bản mà tôi nhập vào.Kiểm tra xem char có phải là một dòng mới

Tôi nhập văn bản bằng vòng lặp while.

while(cin >> ch) 

và tiếp tục với các trường hợp, a, e, i, o, u, tăng biến số nguyên cho các trường hợp tương ứng. Bây giờ phần tiếp theo của câu hỏi cho biết cũng tính các khoảng trống, các tab và dòng mới.

tôi đã cố gắng làm

case ' ': 

và vân vân sử dụng '\ t' và '\ n'. Nhưng có vẻ như nó không tính toán những trường hợp này. Tôi cũng đã cố gắng chỉ sử dụng một mặc định và sử dụng một lệnh if khác

default: 
    if(ch == ' ') 
     ++space; 

vv Nhưng điều này không tiến hành một trong hai. Tôi cũng đã thử đặt các giá trị số nguyên của '', '\ t', '\ n'. Tôi làm gì sai ở đây? Ngoài ra, tôi biết rằng nếu tôi sử dụng isspace() tôi có thể đếm tổng số kết hợp nhưng tôi cần phải tính toán từng cá nhân. Tôi không chắc tại sao bài kiểm tra bình đẳng sẽ không thực hiện công việc.

Trả lời

12

Theo mặc định, đầu vào được định dạng từ các luồng bỏ qua khoảng trắng phía trên. Bạn cần phải hoặc vô hiệu hóa nhảy của khoảng trắng đầu hoặc sử dụng một trong những chức năng mà sẽ không bỏ qua không gian:

std::cin >> std::noskipws; // disables skipping of leading whitespace 
char c; 
while (std::cin.get(c)) { // doesn't skip whitespace anyway 
    ... 
} 
+0

Có cách nào đơn giản hơn để đọc trong không gian màu trắng không? Vào thời điểm này trong cuốn sách, kỹ thuật bạn đề cập đã không được đề cập đến. Phải có một giải pháp đơn giản hơn. – Ares

+0

@Comrade: bạn có thể sử dụng 'std :: getline (std :: cin, str)' trong đó 'str' là một' std :: string'. Nó sẽ đọc các khoảng trống nhưng các dòng mới cần được tính riêng biệt bởi số lần gọi thành công đến 'std :: getline()' (mặc dù nó có thể mang lại kết quả sai nếu dòng cuối cùng được kết thúc bằng một dòng mới). Bạn cũng có thể 'std :: istreambuf_iterator ' để lặp qua chuỗi 'char' (có lẽ là cách tiếp cận nhanh nhất) nhưng tôi nghi ngờ rằng điều này được đề cập trong cuốn sách. –

+0

Phần đếm các nguyên âm đòi hỏi tôi phải tính cả chữ hoa và chữ hoa thường sử dụng một trường hợp cho cả hai. Vì vậy, trong báo cáo chuyển đổi tôi thực sự có chuyển đổi (tolower (ch)). Nếu tôi sử dụng getline (cin, str) trong đó str là một chuỗi, là có một chức năng tương tự để tha thứ() mà tôi có thể sử dụng cho một chuỗi? – Ares

1

Như đã nói bởi Dietmar, không gian màu trắng được bỏ qua theo mặc định. Bạn có thể sử dụng cin.getline() để cung cấp dấu tách chuỗi của riêng bạn thay vì ký tự khoảng trắng. Tôi có thể nói đây là cách đọc đầu vào dễ dàng hơn so với sử dụng cin.get().

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