あなたは明らかに標準 C ライブラリの使用に反対していないので、関数
long strtol (const char* str, char** endptr, int base)
from<cstdlib>
コマンドライン引数がオプションの「-」または「+」プレフィックスが付いた(長い)整数であり、それ以上のものではないことを確認するのに十分です。戻りアドレス '\0' にchar *
格納されていることを確認する必要があるだけです。これは、関数が引数全体を消費したことを示しています。endptr
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
if (argc < 2) {
return 1;
}
char * endp;
long i = strtol(argv[1],&endp,10);
if (!*endp) {
cout << "The value of \"" << argv[1] << "\" is " << i << endl;
return 0;
}
cerr << "\"" << argv[1] << "\" is not an integer" << endl;
return 1;
}
後で...または、Steve Jessop のコメントへのケータリング:
#include <cstdlib>
#include <iostream>
#include <climits>
using namespace std;
int main(int argc, char *argv[])
{
if (argc < 2) {
return 1;
}
char * endp;
long i = strtol(argv[1],&endp,10);
if (*endp) {
cerr << "\"" << argv[1] << "\" is not an integer :(" << endl;
return 1;
}
if (endp == argv[1]) {
cerr << "Empty string passed :(" << endl;
return 1;
}
if (i < 0) {
cerr << "Negative " << i << " passed :(" << endl;
return 1;
}
if (i <= INT_MAX) {
cout << "Non-negative int " << i << " passed :)" << endl;
} else {
cout << "Non-negative long " << i << " passed :)" << endl;
}
return 0;
}
この程度の識別には、ラッパー関数が適しています。ULONG_MAX
また、 の入力が として受け入れられる非常にまれなケースが残っていLONG_MAX
ます。