Verifique se a entrada é inteira em C++

Jinku Hu 12 outubro 2023
  1. Use o algoritmo std::find_if para verificar se a entrada é inteira em C++
  2. Use a função std::string::find_first_not_of para verificar se a entrada é inteira em C++
  3. Use a função std::string::find_first_not_of para verificar se a entrada é inteira em C++
Verifique 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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artigo relacionado - C++ Integer