2011-02-07 17 views
9

Chcę mieć wejście cin odczytane z ciągu znaków.Przekierowanie cin do łańcucha znaków

Czy istnieje sposób, aby to zrobić?

coś takiego:

const char * s = "123 ab"; 
cin.readFrom(s);//<---- I want something like this 

int i; 
cin>>i; 

cout<<i; //123 
+0

Jeśli chcesz użyć tablicy char zamiast std: string, możesz użyć cin.getline (s, n); Gdzie n jest "liczbą znaków do zapisania (łącznie z kończącym znakiem pustym)". Zobacz http://www.cplusplus.com/reference/iostream/istream/getline/. Istnieje również getline dla std :: string, zobacz http://www.cplusplus.com/reference/string/getline/ – anno

+0

@anno: Odczytaj 'cin' ** od ** ciąg, a nie od' cin' do strunowy. –

Odpowiedz

5

Jak to:

#include <sstream> 
#include <iostream> 

std::istringstream stream("Some string 123"); 
streambuf* cin_backup = std::cin.rdbuf(stream.rdbuf()); 

Można wykonać kopię zapasową oryginalnego rdbuf z std :: cin , jeśli chcesz go użyć ponownie.

1

Spróbuj coś takiego:

stringbuf s = string("123 ab"); 
cin.rdbuf(&s); 
5

Polecam używanie strumienia smyczkowego. Możesz używać przeciążonych operatorów I/O, tak jak przy standardowym wyjściu/standardzie. Coś takiego:

string tempString = "123 ab"; 
int firstArg; 
string secondArg; 

stringstream stream(tempString); 

stream >> firstArg >> secondArg; 

cout << firstArg << " " << secondArg; 

ja osobiście uważam, że jest to trochę bardziej jasne niż czytanie w sznurku do normy w, a następnie przy użyciu standardu w operatorów I/O, ale może jest jakiś powód chcesz ją przeczytać do standardu w pierwszym, którego nie rozumiem.

Mam nadzieję, że to pomoże!

0

W rozwiązaniu C++ 17, Ben Voigt rozwiązanie nie zostanie skompilowane, dopóki nie zostanie użyty basic_stringbuf. Zamiast tego użyj poniższego:

stringbuf s; 
    const char *userInput = "10 1 2 3 4 5 6 7 8 9 10 3 7";   
    s.sputn(userInput, strlen(userInput)); 
    cin.rdbuf(&s); 
Powiązane problemy