web-dev-qa-db-ja.com

コマンドライン引数をintに変換する方法は?

引数を取得して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

}
50
nosedive25

この回答は何らかの形で受け入れられたため、一番上に表示されますが、最良ではありませんが、他の回答とコメントに基づいて改善しました。

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を除くすべては、末尾の空白を拒否します。

81
Thomas

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;
}
23
CB Bailey

文字列からのstd :: stoiも使用できます。

    #include <string>

    using namespace std;

    int main (int argc, char** argv)
    {
         if (argc >= 2)
         {
             int val = stoi(argv[1]);
             // ...    
         }
         return 0;
    }
6
HelloWorld

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++を作成している場合は、とにかくそれを行う必要がありますが、それにより問題が発生します。

3
Jerry Coffin

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;
}
1
andrey

C標準ライブラリを使用している場合は、strtol()をご覧ください。

1
WhirlWind

そのように….

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]);

 }
0
Ramanand Yadav