77

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

}
4

7 に答える 7

119

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

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末尾の空白を拒否する以外はすべて。

于 2010-05-09T13:52:37.243 に答える
24

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;
}
于 2010-05-09T13:53:57.053 に答える
3

WhirlWind が指摘しているように、使用する推奨事項atoiはあまり良くありません。atoiはエラーを示す方法がないため、 からと同じ戻り値が得atoi("0");られますatoi("abc");。1 つ目は明らかに意味がありますが、2 つ目は明らかな誤りです。

彼はまたstrtol、少し不器用ですが、これはまったく問題ありません。別の可能性はsscanf、次のようなものを使用することです。

if (1==sscanf(argv[1], "%d", &temp))
    // successful conversion
else
    // couldn't convert input

strtolただし、少し詳細な結果が得られることに注意してください。特に、のような引数を取得した場合123abcsscanf呼び出しは単に数値 (123) を変換したと言うだけでなく、数値を変換したことを伝えるstrtolだけでなく、へのポインタ(つまり、数値に変換できなかっaた部分の先頭)。

C++ を使用しているため、boost::lexical_cast. これは とほぼ同じくらい簡単に使用できますがatoi、(ほぼ) エラーを報告する際に と同じレベルの詳細を提供しますstrtol。最大の費用は、例外をスローできることです。そのため、それを使用するには、コードが例外に対して安全である必要があります。C++ を作成している場合は、とにかくそれを行う必要がありますが、問題が発生します。

于 2010-05-09T14:41:51.637 に答える
1

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

于 2010-05-09T13:52:02.070 に答える
0

そのように私たちはできる....

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

 }
于 2018-04-08T06:53:56.493 に答える