Me gustaría saber cómo limitar un valor de entrada a decimales firmados utilizando std::cin
.Cómo validar la entrada numérica C++
Respuesta
double i;
//Reading the value
cin >> i;
//Numeric input validation
if(!cin.eof())
{
peeked = cin.peek();
if(peeked == 10 && cin.good())
{
//Good!
count << "i is a decimal";
}
else
{
count << "i is not a decimal";
cin.clear();
cin >> discard;
}
}
Esto también da un mensaje de error con la entrada -1a2.0 evitando la asignación de simplemente -1 a i.
Si la variable respaldo del cin
es un número, y la cadena proporcionada no es un número, el valor de retorno es falso, por lo que necesita un bucle:
int someVal;
while(!(cin >> someVal)) {
cin.reset();
cout << "Invalid value, try again.";
}
Algo así como:
double a;
cin >> a;
Debe leer su multa "decimal" firmada.
Necesitará un bucle y algún código para asegurarse de que maneja la entrada no válida de una manera sensata.
¡Buena suerte!
cin's >> el operador funciona leyendo un carácter a la vez hasta que llega al espacio en blanco. Eso sorberá toda la cadena -1a2.0
, que obviamente no es un número, por lo que la operación falla. Parece que en realidad tienes tres campos allí, -1, a y 2.0. Si separa los datos por espacios en blanco, cin podrá leer cada uno sin problemas. Solo recuerde leer char
para el segundo campo.
No estoy tratando de ser grosero. Solo quería compartir una solución que proporcioné, que creo que es más sólida y permite una mejor validación de entrada.
Por favor, se refieren a: My Solution to Input Validation
He intentado muchas técnicas para la lectura de entrada de número entero de que el usuario usando el operador >>
, pero de un modo u otro, todos mis experimentos han fracasado.
Ahora pienso que getline()
función (no es el método con el mismo nombre en std::istream
) y la función de la strtol()
cstdlib
incluir es la única solución consistente predecible para este problema. Agradecería que alguien me probara mal. Aquí es algo así como el que yo uso:
#include <iostream>
#include <cstdlib>
// @arg prompt The question to ask. Will be used again on failure.
int GetInt(const char* prompt = "? ")
{
using namespace std; // *1
while(true)
{
cout << prompt;
string s;
getline(cin,s);
char *endp = 0;
int ret = strtol(s.c_str(),&endp,10);
if(endp!=s.c_str() && !*endp)
return ret;
}
}
- * 1: Colocación de
using namespace whatever;
al ámbito mundial puede dar lugar a la rotura de la "unidad construye" (! Google) en proyectos más grandes, por lo que debe evitarse. Practique no usar de esa manera, ¡incluso en proyectos más pequeños! - Leer enteros a partir de archivos es una cuestión muy diferente. El enfoque de Raúl Roa puede ser bueno para eso si se resuelve adecuadamente. También sugiero que no se toleren los archivos de entrada incorrectos, pero realmente depende de la aplicación.
- Tenga en cuenta que el uso de
>>
ygetline()
en el mismo programa encin
dará lugar a algunos problemas. Use uno solo o google para saber cómo manejar el problema (no demasiado).
La combinación de las técnicas de la respuesta más here y this página web, me sale de entrada
.h
#include <ios> // Provides ios_base::failure
#include <iostream> // Provides cin
template <typename T>
T getValidatedInput()
{
// Get input of type T
T result;
cin >> result;
// Check if the failbit has been set, meaning the beginning of the input
// was not type T. Also make sure the result is the only thing in the input
// stream, otherwise things like 2b would be a valid int.
if (cin.fail() || cin.get() != '\n')
{
// Set the error state flag back to goodbit. If you need to get the input
// again (e.g. this is in a while loop), this is essential. Otherwise, the
// failbit will stay set.
cin.clear();
// Clear the input stream using and empty while loop.
while (cin.get() != '\n')
;
// Throw an exception. Allows the caller to handle it any way you see fit
// (exit, ask for input again, etc.)
throw ios_base::failure("Invalid input.");
}
return result;
}
Uso
inputtest.cpp
#include <cstdlib> // Provides EXIT_SUCCESS
#include <iostream> // Provides cout, cerr, endl
#include "input.h" // Provides getValidatedInput<T>()
int main()
{
using namespace std;
int input;
while (true)
{
cout << "Enter an integer: ";
try
{
input = getValidatedInput<int>();
}
catch (exception e)
{
cerr << e.what() << endl;
continue;
}
break;
}
cout << "You entered: " << input << endl;
return EXIT_SUCCESS;
}
muestra de ejecución
Introduzca un número entero: una entrada no válida
.
Ingrese un número entero: 2b
Entrada no válida.
Introduzca un entero:
Ingresó: 3.
- 1. C# expresiones regulares ayuda - validar la entrada
- 2. Cómo verificar la entrada en UITextField (es decir, entrada numérica)
- 3. ¿Validar la entrada del usuario?
- 4. DAO de validar la entrada
- 5. ¿Cómo puedo alinear la entrada numérica a la derecha y la entrada de texto a la izquierda?
- 6. Validar la entrada de dirección en Android
- 7. ¿Patrón de diseño para validar la entrada?
- 8. C# numérica constantes de
- 9. C# clase base numérica
- 10. Permitir solo la entrada numérica en el cuadro de texto WPF
- 11. ¿Cómo puedo validar la entrada HTML para evitar XSS?
- 12. Cómo validar la entrada de datos en un formulario sharepoint?
- 13. ¿Cómo validar el formulario PDF?
- 14. ¿La mejor manera de validar la entrada de moneda?
- 15. Validar campos de entrada añadidos dinámicamente
- 16. ¿Cómo asignar el carácter a la posición numérica en java?
- 17. Conversión numérica
- 18. La conversión de tipo inmediato numérica para numérica tipo genérico
- 19. Operación numérica utilizando la cadena
- 20. ¿Cómo puedo contar con una base numérica diferente en C++?
- 21. Cómo validar una dirección IP en C#
- 22. ¿Qué es la promoción numérica?
- 23. Guardando matriz 2D numérica en la imagen
- 24. C# Expresión regular para validar una fecha?
- 25. jquery datepicker: Validar el valor de entrada actual?
- 26. Cómo sumar una lista numérica elementos
- 27. ¿Cómo uso try ... excepto o si ... else para validar la entrada del usuario?
- 28. ¿Cómo puedo usar una expresión regular para validar la entrada del mes?
- 29. Integración Numérica - ¿Cómo se puede paralelizar?
- 30. ¿Cómo puedo validar la salida de XmlSerializer?
# 1: ¿Qué es 'descartar'? # 2: ¿Por qué '10'? ¿Qué hay de Mac? # 3: ¿Cómo se forma un ciclo para reintentar? Cuando lo escribió intente con la entrada '" ddd "'. Obtendrá sus errores muchas veces. Si no, entonces tengo mucha curiosidad acerca de tu solución. – Notinlist