C++ 如何将命令行参数转换为int?
我需要获取一个参数并将其转换为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
#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]);
}