总结一起,方便需要时查阅,备不时之需。
实践出真知,无论怎么讲函数的参数都是白搭,其实代码会说话,所以遇到问题还是多上代码。
目录
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