int转string
现列出3中方法,各有优劣。
1、多位整数转化为string
下面的代码片段展示的是正整数转化为string:
int low;
string answer;
while(n>0){
low = n % 10;
n = n / 10;
answer += low + '0';
}
char temp;
for(int i = 0; i < answer.length()/2; i++){
temp = answer[i];
answer[i] = answer[answer.length()-i-1];
answer[answer.length()-i-1] = temp;
}
如果是负整数,需要增加一个bool类型的值进行标记,然后将负数转化为正数之后进行string转化,最后在加上负号。如下:
<pre name="code" class="cpp">int n = -123480000;
bool isNegative = false;if(n<0){n = -n;isNegative = true;}int low;string answer;while(n>0){low = n % 10;n = n / 10;answer += low + '0';}if(isNegative){answer += '-';}char temp;for(int i = 0; i < answer.length()/2; i++){temp = answer[i];answer[i] = answer[answer.length()-i-1];answer[answer.length()-i-1] = temp;}cout << answer;
第3行到第7行判断需要转化的数是否为负数,如果是负数,那么需要将isNegative置为true,然后将负数取相反数。第16行到第18行根据isNegative的值,在字符串后加上负号,最后在将整个串取反,可以得到结果。
该方法的优点:效率较高
该方法的缺点:只可以处理整数,不可以处理浮点数。被转化的整数的范围必须在数据类型的值域范围之内,比如,要转化int型值,那么范围要在-2147483648到2147483647之间。
2、使用strstream或者stringstream函数
引用1说明了这两个函数在C++中的出处,其中strstream是基于C语言的char*的,而stringstream是基于C++的string的,其实现的功能大体相同。在这里我是如此记忆的,因为C++string类有一个函数是c_str(),该函数是将C++string类转化为C字符串char*的一个函数。于是,只要是包含str的,都属于基于C语言char*的,其余的属于基于C++的string的。
C语言 | C++ |
头文件<strstream> | 头文件<sstream> |
class strstreambuf | class stringbuf |
class istrstream | class istringstream |
class ostrstream | class ostringstream |
class strstream | class stringstream |
#include<strstream>
using namespace std;
int n = 65535;
strstream ss;
string s;
ss << n;
ss >> s;
cout << s;
有些博客建议使用基于C++的<sstream>,使用方法是一样的。
关于为什么有些博客建议使用基于C++的<sstream>,解释说因为基于C语言的流可能在某些细节处理不好,可能逐渐会被废除。我实验了一个例子,作为例证。在vs2010中编写了一个程序片段,如下:
int _tmain(int argc, _TCHAR* argv[])
{
double n = 635.866;
strstream ss;
string s;
ss << n;
s = ss.str();
cout << s << endl;
stringstream ss1;
ss1 << n;
s = ss1.str();
cout << s << endl;
system("pause");
return 0;
}
运行结果如下:
635.866屯屯屯屯屯屯屯屯屯屯屯屯妄
635.866
请按任意键继续. . .
635.866
请按任意键继续. . .
可以看到,在使用基于C语言的<strstream>时,结果出现了问题。然而,将第6行的语句换位ss>>s,又不会出现问题。所以还是建议使用基于C++的<sstream>。
在使用基于C++的<sstream>时,我遇到了需要在while循环当中不断的将int型转为string型的问题。发现了stringstream在循环中不会及时清除内部的元素,而是不断累积。如下面代码所示:
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
<span style="white-space:pre"> </span>int n;
<span style="white-space:pre"> </span>string s;
<span style="white-space:pre"> </span>stringstream ss1;
<span style="white-space:pre"> </span>cout << "input: ";
<span style="white-space:pre"> </span>while( cin >> n ){
<span style="white-space:pre"> </span>ss1 << n;
<span style="white-space:pre"> </span>s = ss1.str();
<span style="white-space:pre"> </span>cout << "output: " << s << endl;
<span style="white-space:pre"> </span>cout << "input: ";
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>system("pause");
<span style="white-space:pre"> </span>return 0;
}
输出结果为:
input: 12345
output: 12345
input: 67890
output: 1234567890
output: 12345
input: 67890
output: 1234567890
可以看到,最后一个output是累积了第一次循环中的数据的。有两种方法可以解决这个问题,第一种是在循环内部声明stringstream对象ss1,这样每次循环都会创建新的流对象,新的流对象内部为空。但是由于创建和销毁流对象非常占用资源,所以很低效。第二种方法是使用str("")函数,在使用流前清理上一次残留的数据。注意下面代码第14行。
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int n;
string s;
stringstream ss1;
cout << "input: ";
while( cin >> n ){
ss1.str("");
ss1 << n;
s = ss1.str();
cout << "output: " << s << endl;
cout << "input: ";
}
system("pause");
return 0;
}
为什么不可以使用clear()函数,而必须使用str("")呢?请大家参看引用3的博文。
该方法的优点:
很容易实现,代码量很少,仅仅需要调用几条语句就可以完成转化工作。而且可以批量完成大规模转化任务。
可以完成浮点数的转化。
该方法的缺点:
流的创建比较费资源,千万不可以在循环内部不断的新建流。
在转化浮点数时,指可以保留6位有效数字。(这点应该可以改变)
在转化浮点数时,指可以保留6位有效数字。(这点应该可以改变)
itoa函数时C语言的一个函数,函数原型为:
char *itoa( int value, char *string,int radix);
可以直接返回转化后的char*,也可以存储到第2个参数string中。
该方法的有点:非常简便,可以转化为不同进制。
该方法的缺点:只可以转化整型值
拓展:
itoa() 将整型值转换为字符串
litoa() 将长整型值转换为字符串
ultoa() 将无符号长整型值转换为字符串
litoa() 将长整型值转换为字符串
ultoa() 将无符号长整型值转换为字符串
引用:
2、
bbs csdn