2011-02-07 9 views
9

Quiero tener la entrada cin read de una cadena.Redirigir cin a una cadena

¿Hay alguna manera de hacerlo?

Algo como esto:

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

int i; 
cin>>i; 

cout<<i; //123 
+0

Si desea utilizar una matriz de caracteres en lugar de un std: cadena que podría utilizar cin.getline (s, n); Donde n es el "número de caracteres para almacenar (incluido el carácter nulo de terminación)". Ver http://www.cplusplus.com/reference/iostream/istream/getline/. También hay una línea getline para std :: string, consulte http://www.cplusplus.com/reference/string/getline/ – anno

+0

@anno: lea 'cin' ** de ** una cadena, no de' cin' en una cuerda. –

Respuesta

5

De esta manera:

#include <sstream> 
#include <iostream> 

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

Es posible que desee hacer copia de seguridad de la rdbuf original de std :: cin , si quieres usarlo de nuevo

1

Pruebe algo como:

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

Recomendaría usar una secuencia de secuencia. Puede usar los operadores de E/S sobrecargados como lo haría con entrada estándar/salida estándar. Algo como esto:

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

stringstream stream(tempString); 

stream >> firstArg >> secondArg; 

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

yo personalmente considero que esto sea un poco más claro que la lectura de una serie de estándar y luego usando el estándar de de los operadores de E/S, pero tal vez hay una razón por la que quiere leerlo a la norma en primero que no me doy cuenta.

Espero que esto ayude!

0

En C++ 17, la solución de Ben Voigt no se compilará a menos que use basic_stringbuf. En lugar de utilizar la siguiente:

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);