将C++字符串变量转换为长整型

8

我有一个变量:

string item;

它在运行时初始化。我需要将其转换为长整型。该如何操作?我已经尝试了atol()和strtol(),但对于strtol()和atol(),我总是得到以下错误:

cannot convert 'std::string' to 'const char*' for argument '1' to 'long int strtol(const char*, char**, int)'

cannot convert 'std::string' to 'const char*' for argument '1' to 'long int atol(const char*)'

1
字符串有一个函数c_str,可以将其公开为const char*。 - Markus Mikkolainen
2
item.c_str() 将返回 std::stringconst char* - hmjd
5个回答

23

值得一提的是,这是 C++11,因此您需要检查您是否拥有最新的编译器以及要使用哪些标志。 - BoBTFish
使用long l = atol(item.c_str());是不安全的,应该避免使用。 - Nawaz
3
@Nawaz:"不安全"有点夸张了。它不能让您检查输入是否真的是数值字符串;无论它来自哪里以及您对其进行何种操作,是否“安全”都取决于这一点。 - Mike Seymour
记录一下,如果发生错误,调用 atol 的结果将导致未定义的行为。 - log0
@Nawaz 这就是为什么在执行任何类似于这两个示例的操作之前,我会检查我的字符串是否是有效数字。但如果我这样做,它仍然是“不安全”的吗? - SharpInnovativeTechnologies

21

试着这样做:

long i = atol(item.c_str());

6
long i = atol(item.c_str());这行代码得到-1是因为这个函数并不安全! - Nawaz
2
尝试一下这个: cout << atoi("9879abc879xyz"); 看看它会输出什么! - Nawaz
1
我猜我们对于“不安全”这个词有不同的理解。这只是一种古怪的行为,在很多情况下甚至是被首选的。显然,atol离成为一个好答案还有3-4个级别之遥,但“不安全”似乎有些夸张。 - tenfour
2
@tenfour:这是不安全的,因为它没有告诉你它没有真正转换整个字符串,并且没有告诉你问题所在。这是不安全的,因为它没有告诉你在这两个调用之间的区别:atoi("0")atoi("abc")两者都返回0。:P - Nawaz
提供一个更安全的版本会更有帮助,而不是只说它不安全。因为现在,我需要找到一个更安全的答案。 - LUser
显示剩余3条评论

6
使用字符串流。
#include <sstream>

// code...
std::string text;
std::stringstream buffer(text);
long var;
buffer >> var;

5

使用std::stol将字符转换为长整型,并填充空格。


2
如果您没有访问 C++11 的权限,但可以使用 Boost 库,那么您可以考虑这个选项:
long l = boost::lexical_cast< long >( item );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接