Controlla se l'input è intero in C++

Jinku Hu 12 ottobre 2023
  1. Usa l’algoritmo std::find_if per verificare se l’input è intero in C++
  2. Usa la funzione std::string::find_first_not_of per verificare se l’input è intero in C++
  3. Usa la funzione std::string::find_first_not_of per verificare se l’input è intero in C++
Controlla se l'input è intero in C++

Questo articolo illustrerà più metodi su come verificare se l’input è un numero intero in C++.

Usa l’algoritmo std::find_if per verificare se l’input è intero in C++

std::find_if fa parte della libreria di algoritmi STL definita nel file di intestazione <alogrithm>e può essere utilizzato per cercare l’elemento specifico nell’intervallo. Poiché è molto probabile che l’input dell’utente sia una stringa, assumeremo che i dati di input siano memorizzati in un oggetto std::string. Nota che implementiamo una funzione chiamata isNumber che accetta un riferimento a std::string e restituisce il valore bool.

Il prototipo della funzione std::find_if che abbiamo usato nell’esempio seguente accetta tre argomenti, i primi due dei quali specificano gli elementi dell’intervallo - [first, last]. Il terzo argomento è un predicato unario, che è una funzione lambda che restituisce il valore bool dalla valutazione del valore invertito della funzione isdigit. Sul livello esterno, il valore di ritorno std::find_if viene confrontato con str.end(), poiché il valore true dell’espressione indica che non è stato trovato alcun carattere non numerico; quindi è il numero. Inoltre, logicamente, eseguiamo AND con la prima espressione con !str.empty per indicare che la stringa è vuota e restituiamo 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);
}

Produzione:

Not number
Number
Not number

Usa la funzione std::string::find_first_not_of per verificare se l’input è intero in C++

In alternativa, possiamo reimplementare la funzione isNumber usando il metodo find_first_not_of che è incorporato nell’oggetto std::string. find_first_not_of può prendere il valore di stringa e trovare il primo carattere che non è uguale a nessuno dei caratteri nella sequenza di stringhe. Se la funzione non trova un tale carattere, viene restituito string::npos. Quindi, specifichiamo tutte e dieci le cifre decimali come argomento find_first_not_of e controlliamo la sua uguaglianza a npos, poiché il valore dell’espressione viene restituito dalla funzione.

#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);
}

Produzione:

Not number
Number
Not number

Usa la funzione std::string::find_first_not_of per verificare se l’input è intero in C++

Nota però, il metodo precedente non identifica i numeri reali e li tratta come illegittimi. Quindi, possiamo aggiungere il carattere . carattere alla stringa e consentire alla funzione di riconoscere qualsiasi sequenza di cifre con un punto come un numero valido. Dobbiamo eliminare due casi in cui il . carattere è il primo e l’ultimo simbolo nella sequenza di input, che per nostra convenzione non sarebbe un numero reale valido. Possiamo usare i metodi incorporati string front e back per verificare che l’input non inizi / termini con un punto. Infine, logicamente AND tutte e tre le espressioni l’una con l’altra e restituiamo quel valore.

#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);
}

Produzione:

Not number
Number
Number
Autore: 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

Articolo correlato - C++ Integer