C++ 如何将命令行参数转换为int?

C++ 如何将命令行参数转换为int?,c++,argument-passing,command-line-arguments,C++,Argument Passing,Command Line Arguments,我需要获取一个参数并将其转换为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 o

我需要获取一个参数并将其转换为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

}
#包括
使用名称空间std;
int main(int argc、int argvx[]{
int i=1;
int-answer=23;
内部温度;
//解码参数
如果(argc<2){
printf(“您必须至少提供一个参数\n”);
出口(0);
}
//在这里将其转换为int
}
如果您使用的是C标准库,请查看strtol()。

因为这个答案在某种程度上被接受了,因此将显示在顶部,尽管它不是最好的,但我根据其他答案和注释对它进行了改进

C方式;最简单,但会将任何无效数字视为0:

#include <cstdlib>

int x = atoi(argv[1]);
#包括
intx=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';
}
#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';
}
#包括
errno=0;
char*endptr;
长整数x=strtol(argv[1],&endptr,10);
if(endptr==argv[1]){

std::cerr请注意,
参数不正确。标准格式应为:

int main(int argc, char *argv[])
或相当于:

int main(int argc, char **argv)
实现转换的方法有很多。这是一种方法:

#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;
}
#包括
int main(int argc,char*argv[])
{
如果(argc>=2)
{
标准::istringstream iss(argv[1]);
int-val;
如果(iss>>val)
{
//转换成功
}
}
返回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
(即,无法转换为数字的部分的开头)


既然你使用C++,你也可以考虑使用<代码> Boo::LoCalic Oxase。这几乎是简单的用法,使用<代码> ATOI ,但也提供(粗略)报告错误的细节与代码<> Stotol < /C>一样,最大的代价是它可以抛出异常,所以要使用它,代码必须异常安全。如果你正在编写C++,那么无论如何你都应该这样做,但是这有助于解决这个问题。

< P >与IsTrimFipe的方法可以被改进,以检查没有其他特性。rs已插入预期参数之后:

#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;
}
#包括
int main(int argc,char*argv[])
{
如果(argc>=2)
{
标准::istringstream iss(argv[1]);
int-val;
if((iss>>val)&&iss.eof())//检查eofbit
{
//转换成功
}
}
返回0;
}

也可以使用字符串中的std::stoi

    #include <string>

    using namespace std;

    int main (int argc, char** argv)
    {
         if (argc >= 2)
         {
             int val = stoi(argv[1]);
             // ...    
         }
         return 0;
    }
#包括
使用名称空间std;
int main(int argc,字符**argv)
{
如果(argc>=2)
{
int val=stoi(argv[1]);
// ...    
}
返回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]);

 }

我建议不要使用atoi:“strtol()已经不推荐使用atoi()函数,不应该在新代码中使用它。”不可能知道转换是否确实发生在
atoi
上,这一事实如何?这似乎是我避免
atoi
的一个很好的理由。@whirwind被谁弃用了?@DrumM OP在这个问题中使用了
名称空间std;
。现在我们有了
stoi
解决方案,你介意添加一个
stoi
吗这将使这个答案更加完整。哦,那是我的错误。我本来是这样的,但后来开始尝试不同的东西,忘记把它改回来了。
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]);

 }