2014-03-29 74 views
5

我试图将字符串转换为long。听起来很简单,但我仍然得到同样的错误。我想:将字符串转换为长

include <iostream> 
include <string>  

using namespace std; 

int main() 
{ 
    string myString = ""; 
    cin >> myString; 
    long myLong = atol(myString); 
} 

但是总是出现错误:

.../main.cpp:12: error: cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*' for argument '1' to 'long int atol(const char*)' 

发生。 参考说明如下:

long int atol (const char * str); 

任何帮助?

回答

9

尝试

long myLong = std::stol(myString); 

该函数有三个参数

long stol(const string& str, size_t *idx = 0, int base = 10); 

您可以使用它来确定该号码的解析被采空字符串中的位置,第二个参数。例如

std::string s("123a"); 

size_t n; 

std::stol(s, &n); 

std::cout << n << std::endl; 

输出是

3 

功能可以抛出异常。

8

只写长myLong = atol(myString.c_str());

1

atol()需要const char*;有没有转换从std::stringconst char*,所以如果你真的想使用atol(),则必须调用std::string::c_str()方法来获得原始的类C字符串指针将传递给atol()

// myString is a std::string 
long myLong = atol(myString.c_str()); 

一个更好的C++的方法将是使用stol()(因为C++ 11可用),而不依赖于一个C函数像atol()

long myLong = std::stol(myString); 
1

atol获取作为参数const char*(C风格的字符串),但您传递参数a std::string。编译器无法在const char*std::string之间找到任何可行的转换,所以它会给你提供错误。您可以使用string成员函数std::string::c_str(),它返回一个c样式的字符串,相当于您的内容std::string。用法:

string str = "314159265"; 
cout << "C-ctyle string: " << str.c_str() << endl; 
cout << "Converted to long: " << atol(str.c_str()) << endl;