当我在下面的代码中传递string
变量时,g ++会出错:
无法将'std :: __ cxx11 :: string {aka std :: __ cxx11 :: basic_string}'转换为'const char *'以将参数'1'转换为'int atoi(const char *)'< / p>
我的代码是:
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
string a = "10";
int b = atoi(a);
cout<<b<<"\n";
return 0;
}
但是,如果我将代码更改为:
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
char a[3] = "10";
int b = atoi(a);
cout<<b<<"\n";
return 0;
}
完全正常。
请解释为什么string
无效。 string a
和char a[]
之间有什么区别吗?
答案 0 :(得分:6)
atoi
是从C继承的旧功能。
C没有std::string
,它依赖于以null结尾的char数组。 std::string
有一个c_str()
方法,它返回一个以字符串数据结尾的空终止char*
指针。
int b = atoi(a.c_str());
在C ++ 11中,有一个替代std::stoi()
函数,它将std::string
作为参数:
#include <iostream>
#include <string>
int main()
{
std::string a = "10";
int b = std::stoi(a);
std::cout << b << "\n";
return 0;
}
答案 1 :(得分:3)
您需要传递C样式字符串。
即使用c_str()
更改
int b = atoi(a);
到
int b = atoi(a.c_str());
PS:
这样会更好 - 让编译器计算出长度:
char a[] = "10";
答案 2 :(得分:1)
atoi()
期望以空值终止的char*
作为输入。无法按原样传递string
,因此编译器会出错char*
。另一方面,char[]
可以衰减为char*
,这就是使用char[]
的原因。
使用string
时,如果需要以空值终止的c_str()
指向其字符数据的指针,请调用其char*
方法:
int b = atoi(a.c_str());
答案 3 :(得分:1)
它们之间有区别。 每个功能都有不同的功能:
如前所述,string
有stoi
函数:
string s("20");
cout << stoi(s) * 2; // output: 40
过去,atoi
用于处理char*
转换。
但是,现在atoi
被strtol
所取代,它获得3个参数:
char*
个要解析为long
的字符,char**
,它在解析的字符串之后返回指向的指针,int
为基本数字,应从(2、10、16或其他)解析数字。char c[]="20";
char* end;
cout << strtol(c, &end, 16); // output: 32
像strtol
之类的strtof
,strtod
或strtoll
之类的功能全部转换为float
,double
,{ {1}}和long
。
这些新功能的主要优点主要是错误处理和多库支持。
主要缺点是没有一个函数可以转换为long long
,而只能转换为int
(其他类型除外)。
有关更多详细信息,请参见https://stackoverflow.com/a/22866001/12893141
答案 4 :(得分:0)