この回答はどういうわけか受け入れられたので、一番上に表示されますが、最高ではありませんが、他の回答とコメントに基づいて改善しました。
Cの方法; 最も単純ですが、無効な数値を 0 として扱います。
#include <cstdlib>
int x = atoi(argv[1]);
入力チェックを使用した C の方法:
#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';
}
入力チェックを使用した C++ iostream の方法:
#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';
}
C++11 以降の代替 C++ の方法:
#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';
}
4 つのバリアントはすべて、argc >= 2
. すべて先頭の空白を受け入れます。isspace(argv[1][0])
あなたがそれを望まないかどうかを確認してください。atoi
末尾の空白を拒否する以外はすべて。