引数を取得してintに変換する必要があります。ここに私のコードがあります:
#include <iostream>
using namespace std;
int main(int argc,int argvx[]) {
int i=1;
int answer = 23;
int temp;
// decode arguments
if(argc < 2) {
printf("You must provide at least one argument\n");
exit(0);
}
// Convert it to an int here
}
この回答は何らかの形で受け入れられたため、一番上に表示されますが、最良ではありませんが、他の回答とコメントに基づいて改善しました。
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
を除くすべては、末尾の空白を拒否します。
main
引数が正しくないことに注意してください。標準形式は次のとおりです。
int main(int argc, char *argv[])
または同等に:
int main(int argc, char **argv)
変換を実現するには多くの方法があります。これは1つのアプローチです。
#include <sstream>
int main(int argc, char *argv[])
{
if (argc >= 2)
{
std::istringstream iss( argv[1] );
int val;
if (iss >> val)
{
// Conversion successful
}
}
return 0;
}
文字列からのstd :: stoiも使用できます。
#include <string>
using namespace std;
int main (int argc, char** argv)
{
if (argc >= 2)
{
int val = stoi(argv[1]);
// ...
}
return 0;
}
WhirlWindが指摘したように、atoi
を使用するための推奨事項はあまり良くありません。 atoi
にはエラーを示す方法がないため、atoi("0");
から返されるのと同じ戻り値をatoi("abc");
から取得します。前者は明らかに意味がありますが、後者は明らかなエラーです。
彼はまた、strtol
を推奨しました。別の可能性は、次のようなsscanf
を使用することです。
if (1==sscanf(argv[1], "%d", &temp))
// successful conversion
else
// couldn't convert input
strtol
は少し詳細な結果を与えることに注意してください-特に、123abc
のような引数を取得した場合、sscanf
呼び出しは単純に数値(123)を変換したと言います。一方、strtol
は、番号を変換しただけでなく、a
へのポインター(つまり、それがnotに変換できる部分の先頭) )。
C++を使用しているため、boost::lexical_cast
の使用も検討できます。これはatoi
とほぼ同じくらい簡単に使用できますが、strtol
と同じレベルの詳細なエラー報告も提供します。最大の費用は、例外をスローできることです。そのため、使用するにはコードが例外に対して安全でなければなりません。 C++を作成している場合は、とにかくそれを行う必要がありますが、それにより問題が発生します。
Istringstreamを使用したアプローチは、予想される引数の後に他の文字が挿入されていないことを確認するために改善できます。
#include <sstream>
int main(int argc, char *argv[])
{
if (argc >= 2)
{
std::istringstream iss( argv[1] );
int val;
if ((iss >> val) && iss.eof()) // Check eofbit
{
// Conversion successful
}
}
return 0;
}
C標準ライブラリを使用している場合は、strtol()をご覧ください。
そのように….
int main(int argc, char *argv[]) {
int a, b, c;
*// Converting string type to integer type
// using function "atoi( argument)"*
a = atoi(argv[1]);
b = atoi(argv[2]);
c = atoi(argv[3]);
}