Verifique se a entrada é inteira em C++
-
Use o algoritmo
std::find_if
para verificar se a entrada é inteira em C++ -
Use a função
std::string::find_first_not_of
para verificar se a entrada é inteira em C++ -
Use a função
std::string::find_first_not_of
para verificar se a entrada é inteira em C++
Este artigo demonstrará vários métodos sobre como verificar se a entrada é um número inteiro em C++.
Use o algoritmo std::find_if
para verificar se a entrada é inteira em C++
std::find_if
faz parte da biblioteca de algoritmos STL definida no arquivo de cabeçalho <alogrithm>
e pode ser utilizado para pesquisar o elemento específico no intervalo. Uma vez que a entrada do usuário é provavelmente uma string, assumiremos que os dados de entrada são armazenados em um objeto std::string
. Observe que implementamos uma função chamada isNumber
que leva uma referência a std::string
e retorna o valor bool
.
O protótipo da função std::find_if
que usamos no exemplo a seguir leva três argumentos, os primeiros dois dos quais especificam os elementos do intervalo - [primeiro, último]
. O terceiro argumento é um predicado unário, que é uma função lambda que retorna o valor bool
da avaliação do valor invertido da função isdigit
. Na camada externa, o valor de retorno std::find_if
é comparado a str.end()
, pois o valor true
da expressão indica que nenhum caractere não-dígito foi encontrado; portanto, é o número. Além disso, logicamente fazemos o AND da expressão anterior com !str.empty
para indicar que a string está vazia e retornar false
.
#include <algorithm>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
bool isNumber(const string& str) {
return !str.empty() &&
std::find_if(str.begin(), str.end(), [](unsigned char c) {
return !std::isdigit(c);
}) == str.end();
}
int main() {
string str1 = "12345.";
string str2 = "12312";
string str3 = "123142.2";
isNumber(str1) ? cout << "Number\n" : cout << "Not number\n";
isNumber(str2) ? cout << "Number\n" : cout << "Not number\n";
isNumber(str3) ? cout << "Number\n" : cout << "Not number\n";
exit(EXIT_SUCCESS);
}
Resultado:
Not number
Number
Not number
Use a função std::string::find_first_not_of
para verificar se a entrada é inteira em C++
Alternativamente, podemos reimplementar a função isNumber
usando o método find_first_not_of
que é embutido para o objeto std::string
. find_first_not_of
pode pegar o valor da string e encontrar o primeiro caractere que não seja igual a nenhum dos caracteres na sequência da string. Se a função não encontrar tal caractere, string::npos
é retornado. Assim, especificamos todos os dez dígitos decimais como argumento find_first_not_of
e verificamos sua igualdade para npos
, pois o valor da expressão é retornado da função.
#include <algorithm>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
bool isNumber(const string& str) {
return str.find_first_not_of("0123456789") == string::npos;
}
int main() {
string str1 = "12345.";
string str2 = "12312";
string str3 = "123142.2";
isNumber(str1) ? cout << "Number\n" : cout << "Not number\n";
isNumber(str2) ? cout << "Number\n" : cout << "Not number\n";
isNumber(str3) ? cout << "Number\n" : cout << "Not number\n";
exit(EXIT_SUCCESS);
}
Resultado:
Not number
Number
Not number
Use a função std::string::find_first_not_of
para verificar se a entrada é inteira em C++
Observe, porém, que o método anterior não identifica os números reais e os trata como ilegítimos. Portanto, podemos adicionar o .
caractere à string e permite que a função reconheça qualquer sequência de dígitos com um símbolo de ponto como um número válido. Precisamos eliminar dois casos em que .
caractere é o primeiro e o último símbolo na seqüência de entrada, que por nossa convenção não seria um número real válido. Podemos usar os métodos integrados string
front
e back
para verificar se a entrada não começa / termina com um símbolo de ponto. Finalmente, logicamente fazemos o AND de todas as três expressões entre si e retornamos esse valor.
#include <algorithm>
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
bool isNumber3(const string& str) {
return str.find_first_not_of(".0123456789") == string::npos &&
str.front() != '.' && str.back() != '.';
}
int main() {
string str1 = "12345.";
string str2 = "12312";
string str3 = "123142.2";
isNumber(str1) ? cout << "Number\n" : cout << "Not number\n";
isNumber(str2) ? cout << "Number\n" : cout << "Not number\n";
isNumber(str3) ? cout << "Number\n" : cout << "Not number\n";
exit(EXIT_SUCCESS);
}
Resultado:
Not number
Number
Number
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook