使用 atoi(str.c_str()) 的 C++ 字符串到整数问题

Posted

技术标签:

【中文标题】使用 atoi(str.c_str()) 的 C++ 字符串到整数问题【英文标题】:C++ String to Integer Issue Using atoi(str.c_str()) 【发布时间】:2014-03-21 13:46:39 【问题描述】:

我试图以字符串的形式将变量表示为整数,我已经这样做了;

atoi(str.c_str()) 

字符串最初是从一个文本文件中获取并存储到一个;

CharArrayPtr cmemblock;

然后将其表示为字符串;

    string str;

    for(int i = 0; i < numberofvalues; i++)
       
        str = cmemblock[i];
        int number = atoi(str.c_str());
        cout << number;


    

如果我要将“cout”更改为打印 str;

str = cmemblock[i];
int number = atoi(str.c_str());
cout << str;

数字正确显示在文本文件中

但是,我要求输出为整数,以便可以在循环中表示它以搜索存储在数组中的值。所以这就是“数字”发挥作用的地方,这就是我在何时寻求您帮助的原因;

cout << number;

每当读取新行时,它都表示为“0”,我将如何删除它?如果您需要我的完整代码,它位于几个不同的 .cpp 文件中,并且为了防止任何人复制我的工作,我只能通过电子邮件发送给您,我确定您已经猜到它是大学作业的一部分。

使用会员 Adosi 代码我想出了这个;

         std::string str;

    for(int i = 0; i < numberofvalues; i++)
       

        str = cmemblock[i];
        std::stol(str);
        int number = std::stoi(str);
        cout << number;


    

我收到错误 R6010。我做错了吗?

【问题讨论】:

为什么要从 C++ 调用 atoiatoi 真是骇人听闻。没有人愿意打电话给atoi 大声笑你有什么建议? 修复你的字符串!如果您传递格式错误的输入,您不能责怪该功能无法正常工作。 “1234”是一个数字,“1234\n”IMO 不是。 除了atoi之外的几乎所有东西 Easiest way to convert int to string in C++ 的可能重复项 【参考方案1】:

std::stoi(str)

用这个代替atoi

C++11 有这个和其他一些函数,例如 std::stol() 用于长整数,std::stof() 用于浮点数等。

http://en.cppreference.com/w/cpp/string/basic_string/stol

【讨论】:

我曾尝试使用此方法,但出现以下错误; R6010 - abort() 已被调用 @NoobProgrammer 您是否使用支持 C++11 的编译器进行编译? 应该检查一下道歉,我没有使用 Visual Studio 2010,我使用下面列出的方法。感谢您的帮助! 是否可以在 Visual Studio 2010 中添加 C++11 编译器? @NoobProgrammer 简单地升级和使用 VS2012 或 2013 可能更容易。Nathans 的建议将适用于 VS2010。如果您安装了 boost,我只给出了一种可能的方法。为了快速起见,只需使用字符串流【参考方案2】:

如果你没有C++11 对应std::stoi 但有boost,你可以使用lexical cast

#include <boost/lexical_cast.hpp>

int main() 

    std::string s = "100";
    try 
    
        int n = boost::lexical_cast<int>(s);
        std::cout << "n = " << n << std::endl;
     
    catch (boost::bad_lexical_cast) 
    
        std::cout << "conversion failed" << std::endl;
    

这确保可以进行有效的转换,如果不能进行则抛出异常

关于您的编辑 - 这需要 C++11 编译器才能工作

std::string str;

for(int i = 0; i < numberofvalues; i++)
   

    str = cmemblock[i];
    //std::stol(str); -> This line is unneeded as it converts string to a long
    // Ideally you should check that str is valid here etc. before changing it to an int
    int number = std::stoi(str);
    cout << number;



【讨论】:

我将如何获得提升?看起来很有趣【参考方案3】:

另一种选择是使用std::stringstream

 #include <sstream>
 #include <string>

 int string_to_int(const std::string &string) 
     std::stringstream s(string);
     s >> number;
     if (!s.good()) 
         throw std::exception();
     
     return s;
 

 int main(int argc, const char* argv[]) 
     int number = string_to_int(argv[1]);
     return 0;
 

这不需要任何外部库或 C++11,并且应该与市面上的任何 C++ 编译器兼容。

编辑

充实了示例,展示了如何编写自己的 string_to_int 函数来简化 std::stringstream 的使用。

【讨论】:

以上是关于使用 atoi(str.c_str()) 的 C++ 字符串到整数问题的主要内容,如果未能解决你的问题,请参考以下文章

string int 相互转换

如何将string类型的数字转换成int

剑指offer 把数组排成最小的数 atoi和itoa,pow

c++中的c_str()

C++ 中怎么把string类型转换为float型或int型? C++处理字符串的方法似乎比较麻烦

C++ - string类型转换int类型