C/C++中字符串和数字互转(总结 一)

C/C++中字符串和数字互转(总结 一)

目录

1.调用C的库函数数值转化为字符串

示例代码:

2.调用C的库函数字符串转化为数值

示例代码:

3.不调用库函数实现字符串与数值的转换

3.1 字符串转换为整型int、浮点数double

3.2 整型int转换为字符串

1.调用C的库函数数值转化为字符串

包含头文件#include<stdlib.h> /

1.1 itoa() 、_itoa_s() 将整数转化为字符串(非标准函数)

      char * itoa ( int value, char * str, int base );

      value: 待转整数   

      str:指向以‘\0’结尾的结果字符串的内存 

      base:结果字符串以哪种进制表示,可以选择2-36之间的所有值



       _itoa_s(int _Value, char *buffer, size_t  _BufferCount, int  _Radix);

_itoa_s 比 itoa 多出一个输入参数参数 _BufferCount:

【in】value, 是要转换的数字;

【out】buffer, 是存放转换结果的字符串;

【in】_BufferCount, 存放转换结果的字符串长度,_BufferCount >= _Value的字符串长度+1,可以大 ,但不能小,因为结果字符串需要null-terminal ;(看示例)

【in】radix, 是转换结果显示所用的进制数,2-36。如,2:二进制,10:十进制,16:十六进制

1.2 ltoa():将长整型值转换为字符串。(参数同上)

1.3 ultoa():将无符号长整型值转换为字符串。(参数同上)

1.4 gcvt():将浮点型数转换为字符串,取四舍五入,结果中保留了小数点。

    errno_t  _gcvt_s( char *buffer, size_t sizeInBytes, double value, int digits );

参数

        [out] buffer: 用于存储转换的结果缓冲区。

        [in] sizeInBytes: 存储结果字符串缓冲区的大小。

        [in] value :要转换的值。

        [in] digits :存储的有效数字个数(有效数字第一个不为0的数开始,不算小数点)。

1.5 ecvt():将双精度浮点型值转换为字符串,转换结果中不包含十进制小数点,同样进行四舍五入。

_ecvt_s(   
   char * _Buffer,  
   size_t _SizeInBytes,  
   double _Value,  
   int _Count,  
   int *_Dec,  
   int *_Sign  
);  


     【out】 _Buffer:存储结果的字符缓冲区

     【in】_SizeInBytes:存储结果字符串缓冲区的大小

     【in】 _Value: 被转化浮点数的值

     【in】_Count:结果字符串的位数(整数+小数部分, 结果字符串中没有了小数点,整数部分和小数部分连接在一起 )

     【out】_Dec:记录原始数值字符串中小数点的索引位置

     【out】_Sign:数值转换为字符串后正负号丢失,需要_Sign来记录原始数值的符号(0为正,1为-)。

返回值参考: 参考:https://msdn.microsoft.com/zh-cn/library/vs/alm/ehz2dset(v=vs.110).aspx中的remark(备注)

      注意:五个参数中,区分输出参数和输入参数;

1.6 fcvt():指定位数为转换精度,其余同ecvt()。

   _fcvt_s(char*  _Buffer,    size_t  _BufferCount,double  _Value,int    _FractionalDigitCount,      int*   _PtDec,int*   _PtSign);

   int  _FractionalDigitCount  :指定小数点后小数部分的数字位数,不足使用0补齐,

       其余参数参考 ecvt()

            https://msdn.microsoft.com/zh-cn/library/ty40w2f3.aspx


示例代码:

 

#include <stdlib.h>
#include <iostream>
 
using namespace std;
 
 
int main()
{
	const size_t bufferSize = 32;
	int iNum = 128;
	char buffer[32];
	int base = 16;
	_itoa_s(iNum, buffer, bufferSize, base);
	printf("int iNum = %s ,itoa(iNum, str, base)\n", buffer);         //int iNum = 80 ,itoa(iNum, str, base)
	base = 10;
	_itoa_s(iNum, buffer, bufferSize, base);
	printf("int iNum = %s ,itoa(iNum, str, base)\n", buffer);         //int iNum = 128 ,itoa(iNum, str, base)
 
 
	int decimal;
	int sign;
	int err; 
	char *buf = (char*)malloc(_CVTBUFSIZE);
 
	err = _gcvt_s(buf, _CVTBUFSIZE, 3.1415, 4);
	if (err != 0)
	{
		printf("_ecvt_s failed with error code %d\n", err);
	}
	printf("Converted value: %s\n", buf);
	//Converted value: 3.142      
	//共有4位有效数字符合参数设置
 
 
	err = _ecvt_s(buf, _CVTBUFSIZE, -3141.579654, 6, &decimal, &sign);
 
	if (err != 0)
	{
		printf("_ecvt_s failed with error code %d\n", err);
	}
	printf("Converted value:%s,decimal:%d ,sign:%d\n", buf,decimal,sign);    
	//Converted value:314158,decimal:4 ,sign:1v    
	//共有6位有效数字符合参数设置,小数点应该位于第四个索引出(从0开始)
 
 
	err = _fcvt_s(buf, _CVTBUFSIZE, 1.2, 5, &decimal, &sign);
	if (err != 0)
	{
		printf("_fcvt_s failed with error code %d\n", err);
	}
	printf("Converted value:%s ,decimal:%d ,sign:%d \n", buf,decimal,sign);
	//Converted value:120000 ,decimal:1 ,sign:0
	//小数点后保留了5位,小数点在索引1处
	free(buf);
 
	return 0;
}

2.调用C的库函数字符串转化为数值

2.1 atof():将字符串转换为双精度浮点型值。

double atof (const char* str);

2.2 atoi():将字符串转换为整型值。

int atoi (const char * str);

2.3 atol():将字符串转换为长整型值。

2.4 strtof() :将字符串转换为单精度浮点型值,并报告不能被转换的所有剩余数字。 C++11

 float strtof (const char* str, char** endptr);

2.4 strtod():将字符串转换为双精度浮点型值,并报告不能被转换的所有剩余数字。

2.5 strtol():将字符串转换为长整值,并报告不能被转换的所有剩余数字。

2.6 strtoul():将字符串转换为无符号长整型值,并报告不能被转换的所有剩余数字。

示例代码:



#include <stdlib.h>
#include <ctype.h>
#include <iostream>
 
using namespace std;
 
 
int main()
{
 
	char iDigitStr[] = "     156448";     //注意:可以自动跳过空格,下面各个函数相同
	int iResult = atoi(iDigitStr);           
	printf("atoi iDigitStr = %d \n",iResult);      //atoi iDigitStr = 156448
 
	char fDigitStr[] = "268.356";
	float fResult = atof(fDigitStr);
	printf("atof iDigitStr = %f \n", fResult); //atof iDigitStr = 268.355988
 
	char twofDigits[] = "686.97 365.24";
	char* pEnd;
	float f1, f2;
	f1 = strtof(twofDigits, &pEnd);
	f2 = strtof(pEnd, NULL);
	printf("f1: %.2f, f2:%.2f \n", f1, f2);   //f1: 686.97, f2:365.24
 
	char twofDigits0[] = "686.97,     5.24";
	f1 = strtof(twofDigits0, &pEnd);
	printf("pinter pEnd point to:%s \n", pEnd); //pinter pEnd point to:,     5.24
	pEnd++;
	f2 = strtof(pEnd, NULL);
	printf("f1: %.2f,f2:%.2f \n", f1, f2);          //f1: 686.97,f2:5.24
 
	char str[] = "0xffff";
	long int number;
	if (isxdigit(str[0]))
	{
		number = strtol(str, NULL, 16);
		printf("The hexadecimal number %lx is %ld.\n", number, number);         //The hexadecimal number ffff is 65535.
	}
 
 
	return 0;
}

3.不调用库函数实现字符串与数值的转换

        两道经典的面试题:

3.1 字符串转换为整型int、浮点数double

#include <stdlib.h>
#include <iostream>
 
 using namespace std;
 
 /*
 * 函数介绍: 将字符串转化为整形数
 * 输入参数:str str :数值字符串
 * 输出参数:
 * 返回值: 整型数结果
 */
 int str2int(const char *str)
 {
	 int temp = 0;
	 const char *ptr = str;  //ptr保存str字符串开头
 
	 if (*str == '-' || *str == '+')  //如果第一个字符是正负号,
	 {                      //则移到下一个字符
		 str++;
	 }
 
	 while (*str != 0)
	 {
		 if ((*str < '0') || (*str > '9'))  //如果当前字符不是数字
		 {                       //则退出循环
			 break;
		 }
 
		 temp = temp * 10 + (*str - '0'); //如果当前字符是数字则计算数值
		 str++;      //移到下一个字符
	 }
 
	 if (*ptr == '-')     //如果字符串是以“-”开头,则转换成其相反数
	 {
		 temp = -temp;
	 }
 
	 return temp;
 }
 
 
 /*
 * 函数介绍: 将字符串转化为浮点数
 * 输入参数:str str :数值字符串
 * 输出参数:
 * 返回值: 浮点数结果
 */
 double str2double(const char *str)
 {
 
	 size_t pointPos = std::string(str).find_first_of('.');
	 long long temp = 0;
	 const char *ptr = str;              //ptr保存str字符串开头 
 
	 if (*str == '-' || *str == '+')     //如果第一个字符是正负号,
	 {
		 str++;                          //则移到下一个字符
	 }
 
	 while (*str != 0)
	 {
		 if (*str >= '0' && *str <= '9')
		 {
			 temp = temp * 10 + (*str - '0');
		 }
		 str++;
	 }
 
	 if (*ptr == '-')     //如果字符串是以“-”开头,则转换成其相反数
	 {
		 temp = -temp;
	 }
	 size_t afterPointlength = str - (ptr + pointPos + 1);    //小数点后有几位小数
	 double result = temp*pow(0.1, afterPointlength);
	 return result;
 }
 
 int main()
 {
 
	 double dResult = 0.0;
	 int iResult = 0;
	 char p[32] = "";
 
	 cout << "Please inter an numerical value:";
	 cin.getline(p, 20);                               //从终端获取一个字符串
 
	 string str(p);
	 std::size_t  pointPos = str.find_first_of('.');     //小数点的位置 find_first_of() 返回值在[first,last) ,查找失败返回std::string::npos
 
	 if (pointPos != std::string::npos)        //浮点数  static const size_t npos = -1;   std::string::npos find_first_of() 查找失败返回-1
	 {
		 dResult = str2double(p);            //把字符串转换成浮点数
		 cout << dResult << endl;
	 }
	 else                                   //整数
	 {
		 iResult = str2int(p);             //把字符串转换成整型数
		 cout << iResult << endl;
	 }
 
	 system("pause");
	 return 0;
 }

3.2 整型int转换为字符串

#include <iostream>
using namespace std;
 
 
void int2str(int n, char *str)
{
	char buf[10] = "";
	int i = 0;
	int len = 0;
	int temp = n < 0 ? -n : n;  // temp为n的绝对值
 
	if (str == NULL)
	{
		return;
	}
	while (temp)
	{
		buf[i++] = (temp % 10) + '0';  //把temp的每一位上的数存入buf
		temp = temp / 10;
	}
 
	len = n < 0 ? ++i : i;  //如果n是负数,则多需要一位来存储负号
	str[i] = 0;             //末尾是结束符0
	while (1)
	{
		i--;
		if (buf[len - i - 1] == 0)
		{
			break;
		}
		str[i] = buf[len - i - 1];  //把buf数组里的字符拷到字符串
	}
	if (i == 0)
	{
		str[i] = '-';          //如果是负数,添加一个负号
	}
}
 
 
 
int main()
{
 
	int nNum;
	char p[10];
 
	cout << "Please input an integer:";
	cin >> nNum;
	cout << "output: ";
	int2str(nNum, p);        //整型转换成字符串
	cout << p << endl;
 
return 0;
}

参考: https://www.cnblogs.com/sddai/p/5774121.html

        http://www.cplusplus.com/reference/

        https://msdn.microsoft.com/zh-cn/library/vs/alm/ehz2dset(v=vs.110).aspx

————————————————
版权声明:本文为CSDN博主「@SOAR」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a_Treasure/article/details/82109195

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值