¿Cómo verifica si el usuario no ingresó nada en un comando cin y simplemente presionó enter?C++: ¿cómo puedo verificar si el buffer cin está vacío?
Respuesta
Al leer desde std::cin, es preferible no usar stream extraction operator>>
ya que esto puede tener todo tipo de efectos secundarios desagradables. Por ejemplo, si usted tiene este código:
std::string name;
std::cin >> name;
Y entrar en John Doe
, entonces la línea a leer desde cin
se acaba de celebrar el valor John
, dejando detrás Doe
para ser leído por una futura operación de lectura. Del mismo modo, si tuviera que escribir:
int myInteger;
std::cin >> myInteger;
Y luego escribo en John Doe
, a continuación, cin
entrará en un estado de error y se niegan a hacer cualquier futura operaciones de lectura hasta que explícitamente en claro su estado de error y eliminar los caracteres que causó el error
Una mejor forma de ingresar al usuario es usar std::getline para leer los caracteres del teclado hasta que el usuario presione enter. Por ejemplo:
std::string name;
getline(std::cin, name); // getline doesn't need the std:: prefix here because C++ has ADL.
ADL representa las operaciones de búsqueda argumento dependientes. Ahora, si ingreso John Doe
, el valor de name
será John Doe
y no quedarán datos en cin
. Por otra parte, esto también le permite probar si el usuario teclee enter:
std::string name;
getline(std::cin, name);
if (name.empty()) {
/* ... nothing entered ... */
}
El inconveniente del uso de este enfoque es que si quieres leer en una línea de datos con formato, un int
o una double
que tendrá que analizar la representación de la cadena. Personalmente creo que esto vale la pena porque le da un control más preciso de qué hacer si el usuario ingresa algo inválido y "guarda" cin
para que nunca entre en un estado fallido.
Enseño un curso de programación en C++, y tengo some lecture notes about the streams library que contiene una gran cantidad de detalles sobre cómo leer datos formateados desde cin
de manera segura (principalmente al final del capítulo). No estoy seguro de lo útil que encontrará esto, pero en caso de que sea útil, pensé en publicar el enlace.
Espero que esto ayude!
Gracias por esta respuesta, realmente me ayudó con un programa en el que estoy trabajando. Pongo este comentario porque encontré algo interesante. Tengo una instrucción if-else que verifica si el usuario ingresa "y", "n", algo más o nada en absoluto. Descubrí que el programa no alcanzará el caso de "nada en absoluto" a menos que inicie el if-else con ese caso. No estoy seguro si eso también le pasó a otras personas. –
int main(){
string str[100];
std::cout<<"Hello how are you ? \n";
std::cin>>str;
if(str.length() > 0){
// If input is seen
}
else{
// If input is not seen
}
}
Cualquier problema, házmelo saber.
Esto está mal. cin esperará hasta que haya una entrada válida. – Marlon
No tengo compilador, así que no puedo verificar. pero gracias por decirme. – JesusChrist
Istreams no tienen un extractor para un puntero de cadena (su str es una matriz de cadenas). Siempre puede [usar un compilador en línea para verificar] (http://codepad.org/AMt9sDzN). –
cin no continuará con el programa a menos que el usuario ingrese al menos 1 carácter (ingresar no cuenta). Si el usuario no da CUALQUIER entrada, cin seguirá esperando que el usuario ingrese y luego presione enter.
Casi cierto; depende de qué operación hagas con cin. –
@ Fred-Nurk - ¿Me puede dar un ejemplo? – matzahboy
Getline fue mencionado en otra respuesta, pero cin.get y cin.ignore son otros. –
La forma más simple >>
{
char X=0; // ASCII(0) means a NULL value
cin>>X;
if(X==0 || X==10) // ASCII(10) means ENTER
cout<<"User din't enter ANYTHING !! ";
}
Pero es un problema sencillo ....
CIN simplemente no permitirá que se mueva más allá sin introducir un carácter
por el carácter aquí me refiero a un dígito o alfabeto o símbolo especial, no en el espacio, introduzca nula etc
Esperanza esto resuelve tu problema, si no lo hace, estaré encantado de ayudar solo házmelo saber.
- 1. ¿Cómo purgo el buffer cin?
- 2. Cómo verificar si dynamic está vacío.
- 3. ¿Cómo puedo verificar si un JSON está vacío en NodeJS?
- 4. ¿Cómo verificar si jQuery datepicker está vacío?
- 5. para verificar si todo EditText está vacío
- 6. ¿Cómo puedo verificar si existe un buffer actual en Emacs?
- 7. cómo verificar si un hash está vacío en perl
- 8. ¿Puedo verificar si el iPhone está acoplado?
- 9. ¿Cómo puedo verificar si el valor de la matriz está vacío?
- 10. ¿Cómo puedo verificar con seguridad si el nodo está vacío o no? (Symfony 2 orugas)
- 11. Si el resultado de Linq está vacío
- 12. Para verificar si un objeto está vacío o no
- 13. Cómo verificar si un rango de Excel está vacío en C#
- 14. ¿Cómo puedo determinar si un archivo está vacío?
- 15. En JQuery, ¿cómo puedo verificar si el DOM está listo?
- 16. ¿Cómo puedo verificar si el teléfono Android se está cargando?
- 17. compruebe si NSNumber está vacío
- 18. C# DataGridView Comprobar si está vacío
- 19. ¿Cómo verifico si un repositorio está vacío?
- 20. ¿Cómo comprobar si UITextFields está vacío?
- 21. ¿Cómo verificar si el documento está listo?
- 22. Comprueba si el atributo CoreData está vacío
- 23. ¿Cómo puedo verificar si una cola está vacía?
- 24. Comprobar si el directorio está vacío en Ruby
- 25. ¿Cómo probar si un DataSet está vacío?
- 26. Prueba si el objeto WP_Query está vacío
- 27. Excel Visual Basic - detectar si el rango está vacío
- 28. Magento ¿Cómo verificar si el carrito de la compra está vacío o no?
- 29. jquery: si ul está vacío
- 30. ¿Verifica si un NSMutableDictionary está vacío?
¿Leer una línea y contar cuántos caracteres? –