2013-08-19 10 views
16

Właśnie zacząłem uczyć się C++. Po prostu bawiłem się z tym i natknąłem się na problem polegający na wprowadzaniu ciągu słów po słowie, każde słowo oddzielone białą spacją. Chodzi mi o to, przypuśćmy, że jako dane wejściowe mamprzyjmowanie danych wejściowych ciągu słów przez słowo

name place animal 

. Chcę przeczytać pierwsze słowo, wykonać niektóre operacje na nim. Następnie przeczytaj drugie słowo, wykonaj kilka operacji na tym, a następnie przeczytaj następne słowo, tak dalej.

Próbowałem przechowywania cały ciąg na pierwszy z getline jak ten

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

ale jak mam wykonać operację na każdym słowie i przejść do następnego słowa?

Ponadto, podczas przeglądania w Google C++ widziałem w wielu miejscach, zamiast używać "using namespace std" ludzie wolą pisać "std ::" ze wszystkim. Dlaczego tak jest? Myślę, że robią to samo. Dlaczego więc masz problem z pisaniem go od nowa?

+0

[Dlaczego „using namespace std” uważane złą praktyką?] (Http://stackoverflow.com/q/1452721/995714) –

Odpowiedz

44

Umieść linię w stringstream i ekstraktu z powrotem słowo po słowie:

#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 */ 
    } 
} 

Oczywiście, można po prostu pominąć część getline i czytać słowo po słowie z cin bezpośrednio.

A tu można przeczytać why is using namespace std considered bad practice.

+0

próbowałem czytania z cin. Ale ponieważ słowa są oddzielone białą spacją, Cin zdawał się czytać tylko pierwsze słowo. Prosty cin t; cout t; pokazuje to. Dlatego przełączyłem się na getline. – aandis

+2

@Zack the while loop rozwiązuje ten "problem" – sehe

+0

@jrok podczas kompilacji błędu na podanym kodzie. błąd: zmienna 'std :: istringstream iss' ma inicjator, ale niekompletny typ – aandis

1

getline przechowuje całą linię na raz, co nie jest to, co chcesz. Prostą poprawką jest posiadanie trzech zmiennych i użycie cin do ich wszystkich. C++ będzie analizować automatycznie w przestrzeniach.

#include <iostream> 
using namespace std; 

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

Nie wiem, co szczególnie „operacja” mówisz, więc nie mogę ci pomóc, ale jeśli to nic nie zmienia znaków przeczytać na ciąg i indeksów. Dokumentacja C++ jest świetna. Jeśli chodzi o używanie przestrzeni nazw std; w przeciwieństwie do std :: i innych bibliotek, wiele już powiedziano. Wypróbuj thesequestions na StackOverflow, aby rozpocząć.

+0

Liczba słów w łańcuchu jest nieznana. Jakąkolwiek metodę czytania słów za pomocą cin? – aandis

+0

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

+0

możesz zrobić coś z getline i deliminating characters too http://www.minich.com/education/wyo/cplusplus/cplusplusch10/getfunction.htm –

3

(jest to z korzyścią dla innych, którzy mogą odnosić)

można po prostu użyć cin i char tablicy. Wejście cin jest ograniczone przez pierwsze spacje, które napotka.

#include<iostream> 
using namespace std; 

main() 
{ 
    char word[50]; 
    cin>>word; 
    while(word){ 
     //Do stuff with word[] 
     cin>>word; 
    } 
} 
Powiązane problemy