C语言 数组类型转换,怎样将一个float类型的数组转换成字符(串)数组?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 数组类型转换,怎样将一个float类型的数组转换成字符(串)数组?相关的知识,希望对你有一定的参考价值。

在C语言程序中,如何将float型数组V[]=a1,a2,a3,a4……,an 转换成char型数组B[]=b1,b2,b3,b4……,bn

C语言,在IAR中编译。

不使用sprintf,使用求余%,且代码少

#include<stdio.h>
#include<math.h>

// 4个二进制位转成一个16进制位的字符(3个二进制位转成一个8进制位的字符)(十进制0-9转成字符)
char FourBinaryToOneHexadecimalChar(unsigned char num)

switch (num)

case 0: return '0';
case 1: return '1';
case 2: return '2';
case 3: return '3';
case 4: return '4';
case 5: return '5';
case 6: return '6';
case 7: return '7';
case 8: return '8';
case 9: return '9';
case 10: return 'A';
case 11: return 'B';
case 12: return 'C';
case 13: return 'D';
case 14: return 'E';
case 15: return 'F';
default: return 'X';



// 字符串反转
void ReverseString(char *Source, int Begin, int End)

int i;
char Temp;
for (i = 0; i < ((End - Begin + 1) / 2); ++i)

Temp = Source[Begin + i];
Source[Begin + i] = Source[End - i];
Source[End - i] = Temp;



// 比较float类型大小
int CompareFloat(float A, float B)

if ((A < B)
&& (fabs(A - B) > 1e-6f))

return -1;

else if ((A > B)
&& (fabs(A - B) > 1e-6f))

return 1;

else

return 0;


// float转字符串(十进制)(Precision是小数精度)
void FloatToStringDecimal(float Float, char *Destination, unsigned int Precision)

if (CompareFloat(Float, 0) != 0)

// 将小数移到整数位
float Temp = Float * powf(10.0f, (float)Precision);
// 负数转成正数,否则不能使用迷之转换
if (CompareFloat(Temp, 0) == -1)

Temp = -Temp;

float IntInFloat = 0.0;
modff(Temp, &IntInFloat);
int i = 0;
unsigned char num;
for (i = 0; (i < (int)Precision) && (CompareFloat(IntInFloat, 0) != 0); ++i)

// float 转成 unsigned int
// 迷之转换(因为不知道内部如何实现,所以叫迷之转换)
num = (unsigned char)((unsigned int)IntInFloat % 10);
Destination[i] = FourBinaryToOneHexadecimalChar(num);
IntInFloat /= 10;
modff(IntInFloat, &IntInFloat);

if (Precision != 0)

Destination[i] = '.';
++i;

while (CompareFloat(IntInFloat, 0) != 0)

num = (unsigned char)((unsigned int)IntInFloat % 10);
Destination[i] = FourBinaryToOneHexadecimalChar(num);
IntInFloat /= 10;
modff(IntInFloat, &IntInFloat);
++i;

if (CompareFloat(Float, 0) == -1)

Destination[i] = '-';
++i;

ReverseString(Destination, 0, i - 1);
Destination[i] = '\\0';
return;

else

Destination[0] = '0';
Destination[1] = '\\0';
return;

然后是测试

// 测试代码
fprintf(FP_BaseZeroth, "测试对象:void FloatToStringDecimal(float Float, char *Destination, unsigned int Precision)\\n");
fprintf(FP_BaseZeroth, "测试输入:0; 123; 123.456; -123; -123.456; 1.23456e10f;\\n");
fprintf(FP_BaseZeroth, "预测输出:0; 123; 123.456; -123; -123.456; 有效数字部分确定\\n");
fprintf(FP_BaseZeroth, "实际输出:");
float A[6] =  0.0f, 123.0f, 123.456f, -123.0f, -123.456f, 1.23456e10f ;
char Des[100];
FloatToStringDecimal(A[0], Des, 0);
fprintf(FP_BaseZeroth, "%s; ", Des);
FloatToStringDecimal(A[1], Des, 0);
fprintf(FP_BaseZeroth, "%s; ", Des);
FloatToStringDecimal(A[2], Des, 3);
fprintf(FP_BaseZeroth, "%s; ", Des);
FloatToStringDecimal(A[3], Des, 0);
fprintf(FP_BaseZeroth, "%s; ", Des);
FloatToStringDecimal(A[4], Des, 3);
fprintf(FP_BaseZeroth, "%s; ", Des);
FloatToStringDecimal(A[5], Des, 3);
fprintf(FP_BaseZeroth, "%s; ", Des);
fprintf(FP_BaseZeroth, "\\n\\n");

测试结果

参考技术A 1:小端存储

float 转成HEX字符串
float y=0.1111111119389534f;
char a[9];
unsigned char *p;
p=(unsigned char *)(&y);
sprintf(a,"%02X%02X%02X%02X",p[0],p[1],p[2],p[3]);

2:HEX字符串转float
char a[9]="398EE33D";
float y;
unsigned char *p;
p=(unsigned char *)(&y);
sscanf(a,"%2x%2x%2x%2x",p,p+1,p+2,p+3);

3:大端存储
float 转成HEX字符串
float y=0.1111111119389534f;
char a[9];
unsigned char *p;
p=(unsigned char *)(&y);
sprintf(a,"%02X%02X%02X%02X",p[3],p[2],p[1],p[0]);

4:HEX字符串转float
char a[9]="398EE33D";
float y;
unsigned char *p;
p=(unsigned char *)(&y);
sscanf(a,"%2x%2x%2x%2x",p+3,p+2,p+1,p);
参考技术B #include <stdio.h>

#include <string.h>

int main()



    char s[50];

    float a=1.03;

    sprintf(s,"%f",a);//如果用sprintf函数小数点后会有6位

    for(int i=strlen(s)-1;i>=0;i--)

    

        if(s[i]!='0')

        

            s[i+1]='\\0';//需要把后面的0去掉

            break;

        

    

    printf("%s\\n",s);

    return 0;

参考技术C char char_[7]=(char *)V的。
float value[8],a=0; char value0_char[2],value1_char[10],value2_char[10],value3_char[10]……
sprintf(value0_char, "%-3f",value[0]); //"-"负号表示左对齐,3
sprintf(value1_char, "%-10f",value[1]); //"-"负号表示左对齐,10:占10个空本回答被提问者采纳
参考技术D 给个思路,用sprintf函数,但IAR没用过,不清楚可行不,下面示例

#include<stdio.h>

int main()

char s[50];
float a=1.03;
sprintf(s,"%f",a);
printf("%s\n",s);
return 0;
追问

我用的就是这个办法,觉得太长、慢了,想快、直接的,类似于:float V[7]=0 ; char char_[7]=(char *)V的。
float value[8],a=0; char value0_char[2],value1_char[10],value2_char[10],value3_char[10]……
sprintf(value0_char, "%-3f",value[0]); //"-"负号表示左对齐,3
sprintf(value1_char, "%-10f",value[1]); //"-"负号表示左对齐,10:占10个空
……

追答

用宏,##表示链接字符串,核心部分是
#define name(i) value##i##_char

for(i=0;i<6;i++)

sprintf(name(i), "%-10f",value[i]);

其它的自己琢磨下

float型怎样强制转换成int型

运行时所有数据都存储在内存中,所以相同很正常,float转int会将小数后面的数舍去。

比如定义了一个floata,强制转换成int可写成(int)a。如果是一个表达式,那么只需要将a替换成一个表达式即可。

规格化值:当指数域的8个二进制zhi数字既非全零又非全1时,float数值就是这种情况。

设指数域的八位二进制所表示的十进制数为e, 则公式1中的E就是 E = e - (2^7 - 1)而且此时,将小数域所表示的二进制假设为(f22)(f21)...(f1)(f0) (注2) ,则该小数域所表示的值即为f = 0.(f22)(f21)...(f1)(f0).于是M = 1 + f

扩展资料:

float a=10; // 定义 a为 float 型。

int b=(int)a;// 定义b 为 int 型。然后把 float型的 a 强制转换成 int型。再把a的值 赋值给 b ;

强制转换是指java中的向下转型,因为向下转型的时候会丢失精度。向上转型不需要强制,如:

int a= 10;//定义a为int型。

float b = a; //定义b为float型。然后把a的值赋给b。这种就是向上转型

参考资料来源:百度百科-强制转换

参考技术A 比如你定义了一个float a,强制转换成int可写成(int)a。如果是一个表达式,那么只需要将a替换成一个表达式就OK了。赶紧去试试吧!祝你成功! 参考技术B 这是一个可以转换的程序 照着这样子 改 就差不多了。我试了 可以运行成功!
#include<stdio.h>
main()

float i=2.56;
int a;
a=(int)i;
printf("%d\n",a);

本回答被提问者采纳
参考技术C int i;
float a=1.234;
i=a;
或者
i=(int)a;

一种是隐示的一种是显示的 。两种都会截断后面的小数

以上是关于C语言 数组类型转换,怎样将一个float类型的数组转换成字符(串)数组?的主要内容,如果未能解决你的问题,请参考以下文章

double和char之间怎样转换?谢谢!

请问C语言中如何将int转换为float

arduino 中如何将字符串型转换为float型?

c语言里怎么把float转换为char型?

float型怎样强制转换成int型

C语言中怎样调用函数将十进制转换成二进制?