Controlla se l'input è intero in C++
-
Usa l’algoritmo
std::find_if
per verificare se l’input è intero in C++ -
Usa la funzione
std::string::find_first_not_of
per verificare se l’input è intero in C++ -
Usa la funzione
std::string::find_first_not_of
per verificare 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
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