前几天,应一个小友要求,写了几个字符串转换函数帮助其进行语言学习,自觉其中的几个函数还比较满意,故发布在此,可供初学者参考。
浮点数转换字符串函数说简单也简单,说麻烦,也够烦心的,关键看你如何写了。简单点的几十行代码就行,复杂点的恐怕就的几百行代码了。如果还要考虑移植性、可读性甚至可维护性等就更麻烦的了。我一贯认为,一些事务性的项目应着重考虑移植性、可读性和可维护性等,而常用的带点系统性质的函数代码就应该以执行效率为主。
本文的浮点数转换字符串函数还是比较复杂的,基本可算得上较低层次的转换。由于我已经习惯了用BCB写C/C++代码,因此我写的浮点数转换字符串函数是80位扩展精度浮点数的,但那个小友拿回去试了一下,说他用的VC不支持80位扩展精度浮点数,虽然能定义long double变量,但实际上还是64位的,我只好又重写了一个64位双精度浮点数的,2个版本使用条件编译,这也算得上是移植性吧,呵呵。
下面是浮点数转换字符串函数的全部代码:
2个版本的代码加起来很长,但还有个自写的springf函数(下篇文章开始介绍)也要用到本文除FloatToSt函数外的全部代码。
代码开头的USE_EXTENDED为编译条件,如果你的编译系统不支持80位扩展精度浮点数,可将该定义注释掉。
前面说了,由于该代码主要是学习用的,因此数据转换层次较低,涉及到的有关浮点数格式的知识,可在网上搜索到。当然,知道是一回事,而具体怎样去操作则又是另一回事了,一些关键地方,我都作了较详细的注释,相信能对初学者正确理解浮点数格式有所帮助。例如,如何在不调用C有关函数,不使用汇编而快速的求一个浮点数的绝对值?本文代码就直接对浮点数进行操作:*((LPBYTE)&val + 7) &= 0x7f;(双精度浮点数)和*((LPBYTE)&val + 9) &= 0x7f;(扩展精度浮点数),也就是直接将浮点数的最高位置零,这当然比什么if (val < 0) val = -val语句快多了。不过,如果你要说后者的可移植性好,那我就无话可说了。要说可移植性,前者也可办到的,修改一下:*((LPBYTE)&val + sizeof(val) - 1) &= 0x7f;不就行了么,除非浮点数格式规则改变。只不过本文代码主要用来学习,用显式的方式更有意义。
80位扩展精度浮点数的有效数字为19位,而64位双精度浮点数有效数字为15 - 16位,本文的解析函数FloatResolve分别用了19位和17位的最大转换精度,尽可能的多显示几位,这主要是为自写的sprintf函数(另文介绍)做准备的,本文的浮点数转换字符串函数FloatToStr只用了最大15位的精度。
下面是个很简单的调用例子:
再次声明:本文代码主要供学习使用,如作其它用途,出问题慨不负责。
水平有限,错误在所难免,欢迎指正和指导。邮箱地址:maozefa@hotmail.com
分享到:
相关推荐
本篇文章将深入探讨如何自己动手编写一个C语言函数,实现`float`类型的浮点数转换为字符串的功能。首先,我们需要理解浮点数在计算机中的表示方式,以及C语言中的相关标准库函数。 浮点数在计算机中通常使用IEEE ...
这个目录通常会按照函数的功能分类,如输入/输出操作、字符串处理、数学运算、内存管理和类型转换等。每个函数都有其对应的原型,描述了函数的参数类型和返回值,以及简短的功能说明。通过这个目录,你可以快速查找...
在C语言中,`printf`...通过这个完整的工程文件,你可以学习如何构建这样的自定义函数,理解I/O操作、格式化字符串处理、可变参数列表以及C语言的底层细节。这是一个很好的动手实践项目,可以帮助深化对C语言的理解。
- `puts()` 用于打印字符串,末尾自动添加换行符。 - `getchar()` 和 `putc()` 用于逐字符读写。 2. **内存管理库函数**: - `malloc()` 动态分配内存,`calloc()` 分配并初始化为零的内存。 - `free()` 释放...
6.5 分析和转换字符串 219 6.5.1 转换字符 222 6.5.2 将字符串转换成数值 225 6.7 使用宽字符串 225 6.8 设计一个程序 228 6.8.1 问题 229 6.8.2 分析 229 6.8.3 解决方案 229 6.9 小结 237 6.10 习题 237...
例如,int型用于存储整数,char型用于存储字符,float型则用于存储浮点数。掌握如何声明变量、进行算术运算、条件判断(if-else)以及循环(for、while)是编程的基础。 在单片机编程中,理解并掌握函数的使用也至...
转换控制字符串如`%f`表示输出浮点数,`%d`则用于输出整数。 在学习过程中,掌握不同数据类型是关键。C语言支持整型(如`int`)、长整型(`long`)、浮点型(`float`)、双精度型(`double`)、字符型(`char`)...
为了实现这个功能,我们需要对C语言的内存管理、类型转换、函数指针和格式化字符串的解析有深入的理解。这不仅是一个技术挑战,也是提升编程能力的好机会。通过编写自己的printf,我们可以更好地理解C语言的底层运作...
在C语言中,数据转换是常见的操作,可能涉及到整型、浮点型、字符串之间的转换,或者特定格式的输入输出,比如二进制和十进制的转换。这可能涵盖了类型转换函数如 `atoi()`、`atof()`、`printf()` 和 `scanf()` 等。...
例如,关键字如`if`、`else`、`while`等,标识符由字母、数字和下划线组成,常量可以是整数、浮点数或字符串,运算符包括算术运算符(+、-、*、/)、比较运算符(==、!=、<、>)和逻辑运算符(&&、||)等。 在词法...
varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...
字符串可以通过连接操作符`+`拼接,或者使用反斜杠(\)将值转换为字符串,例如: ```swift let label = "The width is" let width = 94 let widthLabel = label + String(width) // 字符串拼接 ``` 在Swift中,类型...
第三题要求将正数转换为科学计数法,需要用到浮点数处理和字符串格式化。 12年上机题涉及整数分解为连续整数和的问题,可以通过双层循环寻找所有可能的分解组合。对于给定的整数N,通过计算(m+n)(n-m+1)/2来判断...
数字式时钟通常涉及到字符串处理和时间结构体的使用,如C语言中的`struct tm`,用于存储日期和时间。开发者需要理解和运用时间的闰年规则、小时制转换(12小时制和24小时制)以及时间格式化输出。圆盘式时钟的实现则...
在单片机编程中,C语言是常用的语言,它提供了内置的函数如`printf`和`scanf`来实现不同数制之间的转换。例如,`printf`可以接受格式化字符串来输出二进制、八进制、十进制或十六进制数,而`scanf`则用于从用户输入...
- **数组与字符串**:讲解数组的使用,包括一维、多维数组和字符串操作。 #### 编码风格与调试工具 - **编码风格**:提供代码规范建议,如缩进、注释、命名等,以提高代码可读性和维护性。 - **gdb调试器**:演示...
通过使用`%-<宽度>.<精度>f`的格式化字符串,可以实现左对齐输出: ```c void main() { float z = 3.5; printf("%-5.2f", z); // 左对齐,宽度为5,保留2位小数 } ``` #### 控制输出对齐 如果希望输出的数字...
这些词素可以是关键字(如`int`、`for`)、标识符(用户自定义的变量名或函数名)、常量(数字、字符串)、运算符(`+`、`-`、`*`等)以及分隔符(逗号、括号等)。词法分析器通常会将这些词素转换成一系列的标记...