C语言各种(精度、类型、进制的数字)和(字符串)互转

参考: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、小数转字符串

这几个函数功能较为复杂,直接看后文的代码例子
头文件stdlib.h
输入形参:value数字,ndigit有效数字的位数(注意有区别),
输出形参: decpt输出小数点在返回值中的位置,sign输出value的符号,sign=0 代表value为正数

(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',则认为转换成功,否则,认为转换过程中碰到了非数字字符,转换被迫终止


猜你喜欢

转载自blog.csdn.net/qq_31073871/article/details/80545050