C/C++中数值与字符串的相互转换

1.C语言库函数atio(),itoa()

使用atio()和itoa()及相关函数,需包含库文件stdlib.h。
1.1 atoi()—将字符串转换成整型。
函数原型:

int atoi(char * nptr);

函数说明:扫描参数nptr字符串,跳过其前面的字符,直到遇到数字或正负号开始进行转换,遇到非数字或字符串结束时(‘\0’)结束转换。返回int性数值。
注意输入str的范围不要超出int类型的范围
示例:

#include<stdlib.h>
#include<stdio.h>
int main()
{
	int a;
	char str1="123";
	char str2="456";
	a=atoi(str1)+atoi(str2);
	printf("%d",a);//输出结果为 579
}

相关函数:
atof—ascii to float–字符串转换成浮点型
atol—ascii to long—字符串转换成长整形
strtod—字符串转换成浮点型
strtol—字符串转换成长整形
strtoul–字符串转换成无符号长整形
1.2 itoa—将整形转换成字符串
函数原型:

char *itoa( int value, char *string,int radix);

函数说明:
value:要转换的数据。
string:目标字符串的地址。
radix:转换后的进制数,可以是10进制、16进制等,范围必须在 2-36。
注意:itoa不是一个标准的c函数,他是windows特有的,跨平台写程序,要用sprintf。
示例:

#include<stdlib.h>
#include<stdio.h>
int main()
{
 int a=123;
 char *str;
 str=itoa(a);
 printf("%s",str);//输出结果为 123
}

在C++中应用itoa()

#include<iostream>
#include<string>
#include<stdlib.h>
#include<stdio.h>
int main()
{
 int a=3;
 string str,str1;
 str="liya本周迟到"+itoa(a)+"次。";
 cout<<str<<endl;//输出结果为 liya本周迟到3次
 cout<<"今天星期"<<a<<endl;//输出 今天星期3;
 //当然也可以直接利用cout和fstream实现字符串和数值的直接连接,但这种方式只能直接输出到屏幕或文件中,若想要将字符串和数值直接连接的结果存储到变量中,需采用上述方式
}

相关函数:
gcvt—浮点型转换成字符串(四舍五入)

char *gcvt(double number, size_t ndigits, char *buf);

函数说明:
  value:待转换的浮点数。
  ndigit:存储的有效数字位数。
  返回值:char*:指向生成的字符串。
gcvt()所转换后的字符串包含小数点或正负符号。若转换成功,转换后的字符串会放在参数buf 指针所指的间。

ecvt—将双精度浮点型数转换为字符串,转换结果中不包括十进制小数点。

char *Ecvt(double value, int ndigit, int *decpt, int *sign);

函数说明:
  *decpt:存储的小数点位置。
  *sign:转换的数的符号。
  只有数字才存储在该字符串中,小数点位置和value符号在调用之后从decpt和sign获取。
fcvt—把一个浮点数转换为字符串

*fcvt(double value, int ndigit, int *decpt, int *sign);

函数说明:
*decpt表示小数点的位置;
*sign表示符号,0为正数,1为负数。

2.sprintf(),sscanf()函数

使用sprintf()和sscanf()函数,需添加stdio头文件。
2.1 sprintf()
sprintf可以将任意数字包括小数点(.)和负号(-)转换成字符串。
sprintf跟printf在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。
sprintf()是个变参函数,函数原型如下:

int sprintf( char *buffer, const char *format [, argument] ... );

函数说明:
*buffer 存储转换后的字符串
*formate 格式化字符串
argument 变量列表
格式化字符串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。并存储在buffer中。
使用示例:

#include<stdio.h>
#include<stdlib.h>
int main()
{ 

    sprintf(s, "%d", 123);   把整数123打印成一个字符串保存在s中。,产生"123"
    char a[100],e[100]="-";
    int b=132,c=168;
    sprintf(a,"%d.%d",b,c);//将两个整数连接成一个小数存储,a中存储“132.168”
    //浮点数的打印和格式控制
    sprintf(s, "%10.3f", 3.1415626);//产生:"    3.142" 
    return 0;
}

题外话:利用sprinf()还可以用来连接两个字符串(以‘\0’结尾),如下:

char* who = "I";  
char* whom = "CSDN";  
sprintf(s, "%s love %s.", who, whom); //产生:"I love CSDN. "

但要注意,当使用sprintf()直接连接两段字符缓冲区(比如许多从第三方库函数中返回的字符数组,从硬件或者网络传输中读进来的字符流),他们并不是以’/0’结尾,就会导致非法内存操作。要采用如下方式进行连接:

char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};  
char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'}; 
sprintf(s, "%.7s%.7s", a1, a2);//产生:"ABCDEFGHIJKLMN" 

2.2 sscanf()
用来将字符串转换为数值。
函数原型:

int sscanf( char *buffer, const char *format [, argument] ... );

3. 利用stringstream

定义了三个类:istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操作。可以利用stringstream类方便的进行数据类型转换。
(1) 数值转换成字符串

#include<sstream>
#include<string>
using namespace std;
int main()
{
	double a=123.45;
	string res;
	stringstream ss;
	ss<<a;//将数字a转化成流ss
	ss>>res;//将流ss转换成字符串
}

(2)字符串转换成数值

#include<sstream>
#include<string>
using namespace std;
int main()
{
 double b;
 string str="43.28";
 stringstream ss;
 ss<<str;//将字符串转化成流ss
 ss>>b;//将流ss转换成数值b
}

4. c++11的to_string

函数原型:

string to_string (int val);
string to_string (long val);
string to_string (long long val);
string to_string (unsigned val);
string to_string (unsigned long val);
string to_string (unsigned long long val);
string to_string (float val);
string to_string (double val);
string to_string (long double val);
功能:
将数值

转化为字符串。返回对应的字符串。
示例:

#include <iostream>   
#include <string>     
using namespace std;
int main()
{
    string pi = "pi is " + to_string(3.1415926);
    string prime = to_string(2) + " is a prime number";
    cout << pi << '\n';
    cout << prime << '\n';
    return 0;
}

参考资料:
https://www.cnblogs.com/ralap7/p/9171613.html
https://blog.csdn.net/steedhorse/article/details/330206

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值