2013-08-19 33 views
16

Tôi vừa mới bắt đầu học C++. Tôi đã chỉ chơi xung quanh với nó và đi qua một vấn đề mà tham gia lấy đầu vào của một chuỗi từ từng chữ, mỗi từ cách nhau bởi một khoảng trắng. Ý tôi là, giả sử tôi cólấy đầu vào của một từ chuỗi theo từ

name place animal 

làm đầu vào. Tôi muốn đọc từ đầu tiên, thực hiện một số thao tác trên đó. Sau đó đọc từ thứ hai, thực hiện một số thao tác trên đó, và sau đó đọc từ tiếp theo, v.v.

tôi đã cố gắng lưu trữ toàn bộ chuỗi ban đầu với getline như thế này

#include<iostream> 
    using namespace std; 
    int main() 
    { 
    string t; 
    getline(cin,t); 
    cout << t; //just to confirm the input is read correctly 
    } 

Nhưng sau đó làm cách nào để thực hiện thao tác trên mỗi từ và chuyển sang từ tiếp theo?

Ngoài ra, trong khi googling xung quanh về C + + tôi thấy ở nhiều nơi, thay vì sử dụng "sử dụng không gian tên std" người thích viết "std ::" với tất cả mọi thứ. Tại sao vậy? Tôi nghĩ họ cũng làm như vậy. Vậy tại sao lại gặp rắc rối khi viết nó một lần nữa và một lần nữa?

+0

[Tại sao "sử dụng không gian tên std" được coi là thực hành xấu?] (Http://stackoverflow.com/q/1452721/995714) –

Trả lời

44

Đặt dòng trong một stringstream và chiết xuất từng chữ lại:

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

int main() 
{ 
    string t; 
    getline(cin,t); 

    istringstream iss(t); 
    string word; 
    while(iss >> word) { 
     /* do stuff with word */ 
    } 
} 

Tất nhiên, bạn chỉ có thể bỏ qua phần getline và đọc từng chữ từ cin trực tiếp.

Và ở đây bạn có thể đọc why is using namespace std considered bad practice.

+0

Tôi đã thử đọc bằng cin. Nhưng vì các từ được phân tách bằng khoảng trắng, nên cin dường như chỉ đọc từ đầu tiên. Một đơn giản cin t; cout t; cho thấy điều đó. Do đó tôi chuyển sang đường cất. – aandis

+2

@zack vòng lặp while giải quyết rằng "sự cố" – sehe

+0

@jrok nhận được lỗi biên dịch trên mã bạn đã cung cấp. lỗi: biến ‘std :: istringstream iss’ có trình khởi tạo nhưng loại không đầy đủ – aandis

1

getline được lưu trữ toàn bộ dòng cùng một lúc, mà không phải là những gì bạn muốn. Một sửa chữa đơn giản là có ba biến và sử dụng cin để có được tất cả. C++ sẽ phân tích cú pháp tự động tại các khoảng trống.

#include <iostream> 
using namespace std; 

int main() { 
    string a, b, c; 
    cin >> a >> b >> c; 
    //now you have your three words 
    return 0; 
} 

Tôi không biết "hoạt động" cụ thể mà bạn đang nói, vì vậy tôi không thể giúp bạn ở đó, nhưng nếu nó thay đổi ký tự, hãy đọc trên chuỗi và chỉ mục. Tài liệu C++ rất tuyệt. Đối với việc sử dụng không gian tên std; so với std :: và các thư viện khác, đã được nói rất nhiều. Hãy thử thesequestions trên StackOverflow để bắt đầu.

+0

Số từ trong chuỗi không xác định. Bất kỳ phương pháp để đọc các từ với cin sau đó? – aandis

+0

http://stackoverflow.com/questions/8683302/how-to-split-a-space-separated-string-into-multiple-strings-in-c –

+0

bạn có thể làm điều gì đó với đường viền và phân định các ký tự quá http://www.minich.com/education/wyo/cplusplus/cplusplusch10/getfunction.htm –

3

(Đây là vì lợi ích của người khác có thể tham khảo)

Bạn chỉ có thể sử dụng cinchar mảng. Đầu vào cin được giới hạn bởi khoảng trắng đầu tiên mà nó gặp phải.

#include<iostream> 
using namespace std; 

main() 
{ 
    char word[50]; 
    cin>>word; 
    while(word){ 
     //Do stuff with word[] 
     cin>>word; 
    } 
} 
Các vấn đề liên quan