Puisque cette réponse a été acceptée d'une manière ou d'une autre et qu'elle apparaîtra donc en haut, bien qu'elle ne soit pas la meilleure, je l'ai améliorée en me basant sur les autres réponses et les commentaires.
La méthode C ; la plus simple, mais elle traitera tout nombre invalide comme 0 :
#include <cstdlib>
int x = atoi(argv[1]);
La méthode C avec vérification des entrées :
#include <cstdlib>
errno = 0;
char *endptr;
long int x = strtol(argv[1], &endptr, 10);
if (endptr == argv[1]) {
std::cerr << "Invalid number: " << argv[1] << '\n';
} else if (*endptr) {
std::cerr << "Trailing characters after number: " << argv[1] << '\n';
} else if (errno == ERANGE) {
std::cerr << "Number out of range: " << argv[1] << '\n';
}
La méthode C++ iostreams avec vérification des entrées :
#include <sstream>
std::istringstream ss(argv[1]);
int x;
if (!(ss >> x)) {
std::cerr << "Invalid number: " << argv[1] << '\n';
} else if (!ss.eof()) {
std::cerr << "Trailing characters after number: " << argv[1] << '\n';
}
Méthode alternative C++ depuis C++11 :
#include <stdexcept>
#include <string>
std::string arg = argv[1];
try {
std::size_t pos;
int x = std::stoi(arg, &pos);
if (pos < arg.size()) {
std::cerr << "Trailing characters after number: " << arg << '\n';
}
} catch (std::invalid_argument const &ex) {
std::cerr << "Invalid number: " << arg << '\n';
} catch (std::out_of_range const &ex) {
std::cerr << "Number out of range: " << arg << '\n';
}
Les quatre variantes supposent que argc >= 2
. Tous acceptent les espaces en tête ; vérifiez isspace(argv[1][0])
si vous ne le voulez pas. Tous sauf atoi
rejette les espaces blancs de fin de ligne.