2010-05-09 23 views
33

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

} 

回答

59

由于这个答案以某种方式被接受,因此将出现在顶部,虽然它不是最好的,但我根据其他答案和评论改进了它。

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

#include <cstdlib> 

int x = atoi(argv[1]); 

的C方式与输入检查:

#include <cstdlib> 

char *endptr; 
long int x = strtol(argv[1], &endptr, 10); 
if (!*argv[1] || *endptr) 
    cerr << "Invalid number " << argv[1] << '\n'; 

C++的方式与输入检查:

#include <sstream> 

istringstream ss(argv[1]); 
int x; 
if (!(ss >> x)) 
    cerr << "Invalid number " << argv[1] << '\n'; 

所有三个变种假设那argc >= 2

+2

我推荐反对atoi:“atoi()函数已被strtol()弃用,不应在新代码中使用。” – WhirlWind 2010-05-09 13:54:18

+8

如何判断一个转换是否实际上是通过'atoi'进行的?这似乎是避免“atoi”给我的一个很好的理由。 – 2010-05-09 13:55:01

+2

@WhirlWind不赞成由谁? – 2010-05-09 13:55:54

1

看看strtol(),如果你使用C标准库。

18

请注意,您的main参数不正确。标准形式应该是:

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; 
} 
+0

哦opps这是我的错误。我原本是这样做的,但后来开始尝试不同的事情,忘记改回它。 – nosedive25 2010-05-09 14:01:13

+0

+1如果成功包含 – 2010-05-09 14:48:11

+0

非常干净=) – marcelosalloum 2013-10-15 22:02:10

3

正如旋风指出,建议使用atoi是不是真的很不错。 atoi无法指示错误,因此您从atoi("abc");获得与atoi("0");相同的回报。第一个显然是有意义的,但第二个是明显的错误。

他还建议strtol,如果有点笨拙的话,这是非常好的。另一种可能性是使用sscanf,像:

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

注意strtol确实给稍微更详细的结果,虽然 - 特别是,如果你有一个参数像123abc,将sscanf电话就简单的说,它已转换一个数字(123),而strtol不仅会打电话给你,它已经转换了数字,而且还有一个指向a(即,它可以将而不是转换为数字的部分的开始)。

由于您使用的是C++,因此您也可以考虑使用boost::lexical_cast。这与atoi几乎一样易于使用,但也提供(大致)与strtol报告错误相同的详细级别。最大的代价是它可以抛出异常,所以要使用它,你的代码必须是异常安全的。如果你正在编写C++,那么你应该这样做,但它会强迫这个问题。

1

与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; 
} 
3

的std ::从字符串Stoi旅馆也可以使用。

#include <string> 

    using namespace std; 

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