参考:https://zhidao.baidu.com/question/421247296.html
一、数字转字符串
1、通用转换
头文件stdio.h
int sprintf( char *buffer, const char *format [, argument,...] ); //用法仿照printf
2、整数转字符串(支持负数)
头文件stdlib.h
形参:string为接收转换结果的缓冲区,radix是进制,返回值和形参输出都可以得到转换的结果
(1)char *itoa(int value, char *string, int radix); //意为int to ascii
(2)char *ltoa(long value, char *string, int radix); //意为long to ascii
(3)char *ultoa(unsigned long value, char *string, int radix);//意为unsigned long to ascii
3、小数转字符串
(1)char *gcvt(double value, int ndigit, char *buf); //ConVerT 四舍五入,支持负数,输出值中会显示小数点和负号(如果是负数的话)
(2)char *ecvt(double value, int ndigit, int *decpt, int *sign);//ndigit总的有效数字位数,返回值中不显示小数点和正负号
(3)char *fcvt(double value, int ndigit, int *decpt, int *sign);//ndigit小数部分有效数字位数,返回值中不显示小数点和正负号
这3个函数的
共同点:转换结果都是四舍五入
不同点:gcvt必须提供接收结果的缓冲区buf,而ecvt、fcvt由头文件提供缓冲区,直接读返回值字符串即可;
二、字符串转数字(支持负数)
参考:http://www.runoob.com/cprogramming/c-function-strtod.html
1、字符串转十进制数字
头文件<stdlib.h> 、<stdio.h>
只能把十进制样式字符串转为数字,如"-123.56",十六进制的不行,如"0xA5"、"C8"
(1)int atoi(const char *nptr); //意为asc to int 转为整数
(2)double atof(const char *nptr);//意为 asc to float 转为小数
2、字符串转任意进制的数字(可以输出判断转换成功与否,见范例)
输入形参:str,输出形参:若endptr的实参不为NULL,则会将转换终止的str中的字符指针由endptr传回(该值可以用于判断转换是否成功),base为进制。见下面范例程序
(1)double strtod(const char *str, char **endptr);// str to double,支持正负整数/小数/科学计数
(2)long int strtol(const char *str, char **endptr, int base);//str to long int
(3)unsigned long int strtoul(const char *str, char **endptr, int base);//str to unsigned long int
附1:数字转字符串的例子
int main(int argc, char* argv[])
{
double value = -123.456;
char res_buf[20];
int decpt, sign;//小数点的位置decimal_point,符号位(0代表正数)
char* pResult;
pResult = gcvt(value, 10, res_buf);
printf("gcvt返回值与输出:pResult == res_buf ? -> %s\n", (long)pResult == (long)res_buf? "yes":"no");//返回指针会指向输出形参缓冲区
printf("gcvt返回结果是:%s, 输出结果是:%s\n", pResult, res_buf);//不会自动补0
pResult = gcvt(value, 5, res_buf);
printf("gcvt返回结果是:%s, 输出结果是:%s\n", pResult, res_buf);//发生了四舍五入
pResult = ecvt(value, 10, &decpt, &sign);
printf("ecvt返回结果是:%s, 小数点位置=%d,符号位=%d\n", pResult, decpt, sign);//总有效位=10,自动补0
pResult = ecvt(value, 5, &decpt, &sign);
printf("ecvt返回结果是:%s, 小数点位置=%d,符号位=%d\n", pResult, decpt, sign);//总有效位=5,发生四舍五入
pResult = fcvt(value, 5, &decpt, &sign);
printf("fcvt返回结果是:%s, 小数点位置=%d,符号位=%d\n", pResult, decpt, sign);//小数部分有效位=5,自动补0
pResult = fcvt(value, 2, &decpt, &sign);
printf("fcvt返回结果是:%s, 小数点位置=%d,符号位=%d\n", pResult, decpt, sign);//小数部分有效位=2,发生了四舍五入
return 0;
}
运行结果:
附2:字符串转数字范例
字符串转数字:尤其注意endptr的作用int main(int argc, char* argv[])
{
char a[] = "1.2";
char b[] = "1.23ABCD";
char c[] = "-1000.2e-3";
char *endptr;
printf( "num a=%lf\n", strtod(a,NULL) );//不输出endptr
printf( "num a=%lf\n", strtod(a,&endptr) );//转换完成时,输出下一个字符位置到endptr
printf( "a=0x%X, endptr=0x%X\n", a, endptr);//正常终止, endptr指向“1.2”的下一个字符‘\0’
printf( "num b=%lf\n", strtod(b,&endptr) );
printf( "b=0x%X, endptr=0x%X\n", b, endptr);//出错终止,endptr指向“1.23ABCD”有效数字的下一个字符‘A’
printf( "c=%lf\n", strtod(c,NULL) );//支持科学计数法
return 0;
}
运行结果:
由运行结果可见,不论转换成功与否,转换终止时,endptr总是指向:字符串中下一个要转换的字符的位置,
这里有个技巧,可以判断转换是否出错,若endptr指向的是'\0',则认为转换成功,否则,认为转换过程中碰到了非数字字符,转换被迫终止