1. ホーム
  2. c++

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

2023-11-29 13:25:16

質問

引数を取得して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++のiostreamsの方法で、入力チェックを行います。

#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 は末尾の空白を拒否します。