leer par de caracteres separados por \ t c ++
Pregunta
Amigos, Quiero leer un par de caracteres separados por \ t. Quiero seguir leyendo la entrada hasta que el usuario entra en z para cualquiera de los personajes.
Estas son las opciones que pensé:
while (cin>>ch1>>ch2)
{
// process ch1 & ch2
}
std::string str;
while (getline(cin, str) ){
//split string
}
Además, quiero validar la entrada para asegurarse de que es correcta. Para sugerir la mejor manera. Si se trata de un duplicado, por favor que me señale la correcta.
Gracias.
Solución
A pesar de su nombre, se puede utilizar para leer std::getline()
otras cosas que las líneas. Se necesita un tercer parámetro opcional que indica el delimitador. El único defecto es '\n'
, pero no hay razón por la que no se puede utilizar en lugar '\t'
.
std::string line;
while( std::getline(is,line) ) { // read lines
std::istringstream iss(line);
std::string field;
while( std::getline(iss,field,'\t') { // read fields from line
// process field
}
}
Otros consejos
Su primera aproximación es buena y muy ish C ++. El único problema es que va a leer caracteres no sólo separados por \t
, sino también, por ejemplo, por el espacio plano ();
El código sería de la siguiente manera:
#include <iostream>
void main () {
char c1, c2;
while (std::cin >> c1 >> c2) {
if (c1 == 'z' || c2 == 'z') break;
// Otherwise do something useful
}
}
enfoque alternativa es usar getche()
tomar un símbolo de entrada y mostrar en la pantalla. Aquí está el código:
#include <iostream>
#include <conio.h>
void main () {
while (true) {
char c1 = getche();
char delimiter = getche();
char c2 = getche();
// Output end of line
std::cout << std::endl;
if (delimiter != '\t' || c1 == 'z' || c2 == 'z') break;
// Otherwise do something useful
}
}
Tenga en cuenta que en este momento usted no tiene que pulsar la tecla enter
después de entrar en secuencia. Si desea, puede añadir una llamada más getche()
y comprobar si el carbón es igual a 32 (introduzca el código).
int main(int argc, char* argv[])
{
char c;
int count = 0;
string s; // s.reserve(LOTS);
while(cin) while( cin.get(c) ) { // consume newlines as well
if( c == '\t' ) continue;
if( c == 'z' ) break;
++count;
s += c;
}
cout << "got " << count << " tokens." << endl;
cout << s << endl;
return 0;
}