您的位置:首页 > 编程语言 > C语言/C++

[C++杂记] int转string

2015-03-10 08:43 1311 查看

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 strstreambufclass stringbuf
class istrstreamclass istringstream
class ostrstreamclass ostringstream
class strstreamclass stringstream
下面的代码使用了基于C语言的<strstream>来实现了int到string的转化:
#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

请按任意键继续. . .

可以看到,在使用基于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是累积了第一次循环中的数据的。有两种方法可以解决这个问题,第一种是在循环内部声明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位有效数字。(这点应该可以改变)

3、itoa函数
itoa函数时C语言的一个函数,函数原型为:
char *itoa( int value, char *string,int radix);
可以直接返回转化后的char*,也可以存储到第2个参数string中。
该方法的有点:非常简便,可以转化为不同进制。
该方法的缺点:只可以转化整型值

拓展:
itoa() 将整型值转换为字符串

litoa() 将长整型值转换为字符串

ultoa() 将无符号长整型值转换为字符串

引用:
1、网易博客 串口与网络知识 VC Delphi C++标准库中sstream和strstream的区别
2、bbs csdn
3、163博客 不要辜负 期望 stringstream clear()的误区
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: