在c ++中使用atoi()函数

时间:2016-05-14 16:34:05

标签: c++ atoi

当我在下面的代码中传递string变量时,g ++会出错:

  

无法将'std :: __ cxx11 :: string {aka std :: __ cxx11 :: basic_string}'转换为'const char *'以将参数'1'转换为'int atoi(con​​st 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 achar a[]之间有什么区别吗?

5 个答案:

答案 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)

它们之间有区别。 每个功能都有不同的功能:

字符串

如前所述,stringstoi函数:

string s("20");
cout << stoi(s) * 2; // output: 40

字符*

过去,atoi用于处理char*转换。

但是,现在atoistrtol所取代,它获得3个参数:

  1. char*个要解析为long的字符,
  2. char**,它在解析的字符串之后返回指向的指针,
  3. int为基本数字,应从(2、10、16或其他)解析数字。
char c[]="20";
char* end;
cout << strtol(c, &end, 16); // output: 32

strtol之类的strtofstrtodstrtoll之类的功能全部转换为floatdouble,{ {1}}和long

这些新功能的主要优点主要是错误处理和多库支持。

主要缺点是没有一个函数可以转换为long long,而只能转换为int(其他类型除外)。

有关更多详细信息,请参见https://stackoverflow.com/a/22866001/12893141

答案 4 :(得分:0)

根据atoi()的文档,该函数需要一个&#34;指向空终止字节字符串的指针&#34; 基本上是C风格的串。 std::string是C ++中的字符串类型,但它有一个方法c_str(),可以返回一个C字符串,您可以将其传递给atoi()

string a = "10";
int b = atoi(a.c_str());

但是如果您仍想传递std::string并且您的编译器支持C ++ 11,那么您可以使用stoi()

string a = "10";
int b = stoi(a);