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

Alternative to itoa() for converting integer to string C++?

本问题已经有最佳答案,请猛点这里访问。

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


在C++ 11中,可以使用EDCOX1×0:

1
2
3
#include <string>

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

如果你在C++ 11之前工作,你可以使用C++流:

1
2
3
4
5
6
7
#include <sstream>

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/


Boost::词汇演员表工作得很好。

1
2
3
4
#include <boost/lexical_cast.hpp>
int main(int argc, char** argv) {
    std::string foo = boost::lexical_cast<std::string>(argc);
}


考古学

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

C方式

使用S喷雾剂。或者SNPrTNF。或者你找到的任何工具。

尽管一些功能不在标准中,正如他的一个评论中的"One ByOne"所正确提到的,大多数编译器都会提供一个替代方案(例如Visual C++有它自己的SNSNPRTF,如果需要的话,您可以将TyPulf发送到SNPRTNF)。

C++方式。

在STD:STRIGSTATH(或者甚至是弃用STD::STRESFH)中使用C++流(如Habor萨特在他的一本书中提出的那样,因为它稍微快一点)。

结论

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

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

  • 更安全的方式(即C++方式),如果你知道代码的这一部分并不重要,那么最好确保代码的这一部分不会在随机的时刻中断,因为有人误解了一个大小或指针(这是发生在现实生活中的,比如…昨天,在我的电脑上,因为有人认为使用更快的方法而不需要它是"酷"的。


尝试Simulf():

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

sprintf()与printf()类似,但输出到字符串。

另外,正如注释中提到的,您可能希望使用snprintf()来阻止发生缓冲区溢出(您要转换的数字不适合您的字符串大小)。它的工作方式如下:

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


在幕后,词汇演员会这样做:

1
2
3
4
std::stringstream str;
str << myint;
std::string result;
str >> result;

如果你不想为此"拖入"助推器,那么使用上面的方法是一个很好的解决方案。


我们可以在C++中定义我们自己的EDOCX1 7函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
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


C++11最终解决了这个问题,提供了std::to_string。另外,对于较旧的编译器,boost::lexical_cast也是一个方便的工具。


我使用这些模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <typename T> string toStr(T tmp)
{
    ostringstream out;
    out << tmp;
    return out.str();
}


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


尝试Booost .Frase/FASTFLASE,两个高质量C++库:

1
2
int i = 10;
std::string result;

带增强格式

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

或FastFormat

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

显然,它们都比简单地转换一个整数做得多。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//Mark Renslow, Globe University, Minnesota School of Business, Utah Career College
//C++ instructor and Network Dean of Information Technology

#include <cstdlib>
#include <iostream>
#include <string>
#include <sstream> // string stream
#include <direct.h>

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 <class T>
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;
}

分配足够长度的字符串,然后使用snprintf。


最好的答案是IMO,这里提供的功能是:

网址:http://www.jb.man.ac.uk/~slowe/cpp/itoa.html

它模仿许多libs提供的非ansi函数。

1
char* itoa(int value, char* result, int base);

它也是闪电快的,并且在-O3之下被优化,以及你不使用C++ StRIGIG格式(…)的原因…或者说sprintf是他们太慢了,对吧?


注意,所有stringstream方法都可能涉及到使用locale对象进行格式化时的锁定。如果您正在使用来自多个线程的转换,这可能是需要注意的事情…

更多信息请参见此处。用C++将数字转换为具有指定长度的字符串


1
2
3
4
5
6
7
int number = 123;

stringstream = s;

s << number;

cout << ss.str() << endl;

如果您对快速和安全的整数到字符串转换方法感兴趣,并且不限于标准库,我可以从C++格式库中推荐EDCOX1×0的方法:

1
2
3
fmt::FormatInt(42).str();   // convert to std::string
fmt::FormatInt(42).c_str(); // convert and get as a C string
                            // (mind the lifetime, same as std::string::c_str())

根据Boost Karma的整数到字符串转换基准,该方法比glibc的sprintfstd::stringstream快几倍。它甚至比一个独立的基准所证实的促进业力自身的int_generator更快。

免责声明:我是这个图书馆的作者。


我在一段时间前编写了这个线程安全函数,对结果非常满意,并且认为该算法是轻量级和精简的,性能大约是标准msvc Itoa()函数的3倍。

这是链接。优化的Base-10 Only ITOA()函数?性能至少是sprintf()的10倍。基准也是功能的QA测试,如下所示。

1
2
3
4
5
6
7
8
9
10
11
start = clock();
for (int i = LONG_MIN; i < LONG_MAX; i++) {
    if (i != atoi(_i32toa(buff, (int32_t)i))) {
        printf("
Error for %i"
, i);
    }
    if (!i) printf("
At zero"
);
}
printf("
Elapsed time was %f milliseconds"
, (double)clock() - (double)(start));

对于使用调用者的存储,有一些愚蠢的建议,这些建议会使结果浮动在调用者地址空间的缓冲区中。忽略它们。正如基准/QA代码所示,我列出的代码工作得很好。

我相信这段代码足够精简,可以在嵌入式环境中使用。当然了。


在Windows CE派生的平台上,默认情况下没有iostreams。去那里的方法是优先与_itoa<>家族,通常是_itow<>(因为大多数字符串的东西都是unicode在那里)。


以上建议大部分技术上不是C++,而是C解决方案。

研究STD:STRIGSWATH的使用。