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.

¿Fue útil?

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top