当前位置:  开发笔记 > 编程语言 > 正文

用于将整数转换为字符串C++的itoa()的替代方案?

如何解决《用于将整数转换为字符串C++的itoa()的替代方案?》经验,为你挑选了10个好方法。

我想知道是否存在itoa()将整数转换为字符串的替代方法,因为当我在visual Studio中运行它时会收到警告,当我尝试在Linux下构建程序时,我收到编译错误.



1> spoulson..:

在C++ 11中,您可以使用std::to_string:

#include 

std::string s = std::to_string(5);

如果您在使用C++ 11之前,可以使用C++流:

#include 

int i = 5;
std::string s;
std::stringstream out;
out << i;
s = out.str();

取自http://notfaq.wordpress.com/2006/08/30/c-convert-int-to-string/



2> Leon Timmerm..:

boost :: lexical_cast工作得很好.

#include 
int main(int argc, char** argv) {
    std::string foo = boost::lexical_cast(argc);
}


将Boost库作为单个演员.:(
但如果你已经在使用Boost,它就是免费赠品.
痛苦的慢?你是在哪里拿到的?它实际上表现得相当好!http://www.boost.org/doc/libs/1_49_0/doc/html/boost_lexical_cast/performance.html
boost :: lexical_cast非常缓慢.如果性能很重要,请不要使用它.
我认为担心这种情况在大多数情况下都是过早优化.除非我的探查者告诉我,否则它不会阻止我使用它.

3> paercebal..:

考古学

itoa是一个非标准的辅助函数,旨在补充atoi标准函数,并且可能隐藏了sprintf(其大部分功能可以用sprintf实现):http://www.cplusplus.com/reference/clibrary/cstdlib/ itoa.html

C路

使用sprintf.或snprintf.或者你找到的任何工具.

尽管有些函数不在标准中,正如他的一篇评论中的"onebyone"正确提到的,大多数编译器都会为您提供一个替代方案(例如,Visual C++有自己的_snprintf,如果需要,可以输入sndef到snprintf).

C++的方式.

使用C++流(在当前案例中为std :: stringstream(甚至是已弃用的std :: strstream,正如Herb Sutter在他的一本书中所提出的那样,因为它有点快).

结论

你是C++,这意味着你可以选择你想要的方式:

更快的方式(即C方式),但你应该确保代码是你的应用程序的瓶颈(过早的优化是邪恶的,等等),并且你的代码被安全封装,以避免存在缓冲区溢出的风险.

更安全的方式(即C++的方式),如果你知道这部分代码并不重要,所以最好是确保这部分代码不会随意瞬间打破,因为有人误以为大小或指针(恰好在现实生活中,比如...昨天,在我的电脑上,因为有人认为使用更快的方式"很酷"而不需要它.


@Chris Kaminski:我的一次测试确实表明sprintf的速度提高了5到10倍,这证实了我的Herb Sutter自己的测量结果.如果你有不同结果的测试,我很感兴趣.
@Chris Kaminski:如果你研究c ++流的接口,你会理解为什么它们变慢,即使输出一个简单的整数:在C中,你使用自己的缓冲区,可能在堆栈中分配,而在C++中,stringstream将使用它自己的.在C中,您可以重用缓冲区.在C++中,您必须从stringstream中提取字符串,这是一个std :: string副本.
@fuzzyTew:感谢您的关注,但我想我对C API和C++ API都很熟悉,可以处理sprintf,知道何时(以及如何)安全地使用它,何时不使用它... :-D
@fuzzyTew:`1`在我的帖子中,我谈到了sprintf及其安全变体,而不仅仅是sprintf.`2`知道编译代码的位置并不是一件不可能完成的任务(在我的情况下,最糟糕的是,Windows/VC++,Solaris/CC和Linux/g ++,最好只有Windows/VC++).`3`你正在描述一个试图破坏你的代码的破坏者是常态的世界.我的世界是由普通的开发人员组成的,因此通过重写我的每个API的"安全"版本而浪费时间试图保护我的代码免受破坏者的影响并不高效.[...]
@fuzzyTew:[...]`结论`使用最好的工具.如果最好的工具是隐藏在包装类或函数中的sprintf ......现在,如果你提倡重写sprintf作为这个问题的答案,请随意写下你自己的答案.我不确定问题作者是否阅读了所有评论.

4> Jeremy Ruten..:

试试sprintf():

char str[12];
int num = 3;
sprintf(str, "%d", num); // str now contains "3"

sprintf()与printf()类似,但输出为字符串.

另外,正如Parappa在评论中提到的那样,您可能希望使用snprintf()来阻止缓冲区溢出(您转换的数字不符合字符串的大小.)它的工作方式如下:

snprintf(str, sizeof(str), "%d", num);


您应该使用snprintf()来避免缓冲区溢出.在上面的例子中只有一行改变:snprintf(str,sizeof(str),"%d",num);
sprintf()不是C++.这是C.
IMHO Stringstreams将是一个更好的选择.
OJ:sprintf也是c ++ ......大多数C语言都适用于c ++.这不是意外.c ++本来是一个基于c ++的"层"......不是像它那样的定义架构(可能是一个错误)变成了

5> 1800 INFORMA..:

在幕后,lexical_cast执行此操作:

std::stringstream str;
str << myint;
std::string result;
str >> result;

如果您不想为此"拖入"提升,那么使用上述方法是一个很好的解决方案.



6> Vasaka..:

С++ 11最终解决了这个问题std::to_string.也是boost::lexical_cast旧编译器的便利工具.



7> Tag318..:

我们可以iota在c ++中定义自己的函数:

string itoa(int a)
{
    string ss="";   //create empty string
    while(a)
    {
        int x=a%10;
        a/=10;
        char i='0';
        i=i+x;
        ss=i+ss;      //append new character at the front of the string!
    }
    return ss;
}

别忘了#include .


不适用于<= 0.

8> jm1234567890..:

我使用这些模板

template  string toStr(T tmp)
{
    ostringstream out;
    out << tmp;
    return out.str();
}


template  T strTo(string tmp)
{
    T output;
    istringstream in(tmp);
    in >> output;
    return output;
}



9> dcw..:

尝试使用Boost.Format或FastFormat这两个高质量的C++库:

int i = 10;
std::string result;

用Boost.Format

result = str(boost::format("%1%", i));

或FastFormat

fastformat::fmt(result, "{0}", i);
fastformat::write(result, i);

显然,它们都比单个整数的简单转换做得更多



10> 小智..:

您可以使用一个巧妙编写的模板函数将任何内容转换为字符串.此代码示例使用循环在Win-32系统中创建子目录.字符串连接运算符operator +用于将根与后缀连接以生成目录名.通过使用模板函数将循环控制变量i转换为C++字符串并将其与另一个字符串连接来创建后缀.

//Mark Renslow, Globe University, Minnesota School of Business, Utah Career College
//C++ instructor and Network Dean of Information Technology

#include 
#include 
#include 
#include  // string stream
#include 

using namespace std;

string intToString(int x)
{
/**************************************/
/* This function is similar to itoa() */
/* "integer to alpha", a non-standard */
/* C language function. It takes an   */
/* integer as input and as output,    */
/* returns a C++ string.              */
/* itoa()  returned a C-string (null- */
/* terminated)                        */
/* This function is not needed because*/
/* the following template function    */
/* does it all                        */
/**************************************/   
       string r;
       stringstream s;

       s << x;
       r = s.str();

       return r;

}

template 
string toString( T argument)
{
/**************************************/
/* This template shows the power of   */
/* C++ templates. This function will  */
/* convert anything to a string!      */
/* Precondition:                      */
/* operator<< is defined for type T    */
/**************************************/
       string r;
       stringstream s;

       s << argument;
       r = s.str();

       return r;

}

int main( )
{
    string s;

    cout << "What directory would you like me to make?";

    cin >> s;

    try
    {
      mkdir(s.c_str());
    }
    catch (exception& e) 
    {
      cerr << e.what( ) << endl;
    }

    chdir(s.c_str());

    //Using a loop and string concatenation to make several sub-directories
    for(int i = 0; i < 10; i++)
    {
        s = "Dir_";
        s = s + toString(i);
        mkdir(s.c_str());
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有