【问题标题】:use of atoi() function in c++c++中atoi()函数的使用
【发布时间】:2016-05-14 16:34:05
【问题描述】:

当我在下面的代码中传递一个string 变量时,g++ 给出了一个错误:

无法将 'std::__cxx11::string {aka std::__cxx11::basic_string}' 转换为 'const char*' 以将参数 '1' 转换为 'int atoi(const char*)'

我的代码是:

#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[]有区别吗?

【问题讨论】:

  • “字符串a和char a[]有区别吗?”是的。一个是std::string,一个不是。
  • 正如错误消息中明确指出的那样,需要进行转换。

标签: c++ atoi


【解决方案1】:

atoi 是从 C 继承的旧函数。

C 没有std::string,而是依赖于以空字符结尾的字符数组。 std::string 有一个 c_str() 方法,它返回一个以 null 结尾的 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;
}

【讨论】:

  • 您需要#include &lt;string&gt; 才能使用std::stringstd::stoi()
  • [stackoverflow.com/questions/1452721/… using namespace std 不好)
  • @EdHeal 是的,但这超出了 OP 的问题范围。我采用了已有的内容并应用了最少的更改来回答问题。
  • @TrevorHickey:从技术上讲,您实际上并没有回答所提出的问题(为什么string 不适用于atoi()),您只提供了一个可用于@987654337 的替代代码@.
  • @EdHeal:这是的答案,是的。但特雷弗的回答并没有真正解释这一点。
【解决方案2】:

你需要传递一个 C 风格的字符串。

即使用c_str()

改变

int b = atoi(a);

int b = atoi(a.c_str());

PS:

这样会更好——让编译器计算出长度:

char a[] = "10";

【讨论】:

    【解决方案3】:

    atoi() 需要一个以 null 结尾的 char* 作为输入。 string 不能在预期 char* 的地方按原样传递,因此会出现编译器错误。另一方面,char[] 可以衰减为char*,这就是使用char[] 有效的原因。

    使用string 时,当您需要一个指向其字符数据的以空结尾的char* 指针时,调用其c_str() 方法:

    int b = atoi(a.c_str());
    

    【讨论】:

      【解决方案4】:

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

      字符串

      如前所述,stringstoi 函数:

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

      字符*

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

      但是,现在atoi 被替换为strtol,它获得了 3 个参数:

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

      有很多函数,比如strtol,比如strtofstrtod,或者strtoll,它们可以转换为floatdoublelonglong long

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

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

      更多详情请见https://stackoverflow.com/a/22866001/12893141

      【讨论】:

        【解决方案5】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-26
          • 1970-01-01
          • 1970-01-01
          • 2013-11-07
          • 2012-05-21
          • 1970-01-01
          相关资源
          最近更新 更多