我需要获取一个参数并将其转换为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
}
答案 0 :(得分:78)
由于这个答案以某种方式被接受,因此会出现在顶部,虽然它不是最好的,但我已根据其他答案和评论对其进行了改进。
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';
}
所有四种变体都假定为argc >= 2
。所有人都接受领先的空白;如果你不想要,请检查isspace(argv[1][0])
。除atoi
之外的所有内容都拒绝尾随空格。
答案 1 :(得分:21)
请注意,您的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;
}
答案 2 :(得分:5)
std :: stoi from string也可以使用。
#include <string>
using namespace std;
int main (int argc, char** argv)
{
if (argc >= 2)
{
int val = stoi(argv[1]);
// ...
}
return 0;
}
答案 3 :(得分:3)
正如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 ++,因此您也可以考虑使用boost::lexical_cast
。这几乎与atoi
一样简单,但在报告错误时也提供了(大致)与strtol
相同的详细程度。最大的花费是它可以抛出异常,所以要使用它,你的代码必须是异常安全的。如果您正在编写C ++,那么无论如何都应该这样做,但它会强制解决问题。
答案 4 :(得分:1)
如果您使用的是C标准库,请查看strtol()。
答案 5 :(得分: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;
}
答案 6 :(得分: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]);
}