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

    总结一起,方便需要时查阅,备不时之需。

    实践出真知,无论怎么讲函数的参数都是白搭,其实代码会说话,所以遇到问题还是多上代码。

目录

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

    示例代码:

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

    示例代码:

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

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

 3.2  整型int转换为字符串


 

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

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

  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

猜你喜欢

转载自blog.csdn.net/a_Treasure/article/details/82109195