c 语言实现 atof() 函数

2023-11-16

1. atof() 函数介绍

C 库函数 *double atof(const char str) 属于库函数 stdlib.h,把参数 str 所指向的字符串转换为一个浮点数。

具体操作为:

跳过字符串开始的空白符,识别数字,点好,或正负符号,开始扫描合法浮点表达形式,直到遇到非合法字符结束扫描。如果空白符后是非合法字符,结束扫描,不会扫描后面的数字。

浮点数的合法表达形式

参见:C Primer Plus ---- Chapter 3 ----Data and C ---- 基本数据类型

-1.56E+12
2.87e-3
3.14159
.2
4e16
.8E-5
100.

  • 正数的符号位可以省略,小数部分的小数点(2E5)或者指数部分可以省略(12.),但两者不能同时省略。
  • 小数的小数部分可以省略(3.E16)或者省略整数部分(.45E–6),但两者不能同时省略。
  • 小数部分和指数部分不能有空格。

测试自带 atof() 函数

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *s_gets(char *s, int n)
{
  char *ret, *find;
  ret = fgets(s, n, stdin);
  if(ret)
  {
    find = strchr(s, '\n');
    if(find)
    {
      *find = '\0';
    }
    else
    while(getchar() != '\n')
    continue;
  }
  return ret;
}
int main()
{
  double n;
  char s[10];
  while(s_gets(s, 10) && s[0] != '\0')
  {
    n = atof(s);
    printf("string: %s, float: %f\n", s, n);
  }
  return 0;
}

结果:

 3.2s      
string:  3.2s, float: 3.200000
.4s
string: .4s, float: 0.400000
-e2
string: -e2, float: 0.000000
.e3
string: .e3, float: 0.000000
1.e3s
string: 1.e3s, float: 1000.000000
.3e+2s
string: .3e+2s, float: 30.000000
.0e3s
string: .0e3s, float: 0.000000
.2e-2s
string: .2e-2s, float: 0.002000

2. 实现 atof() 函数功能

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
#define LEN 40
char *s_gets(char *s, int n);
double myatof(const char *s);
int main(void)
{
	char s[LEN];
	double num;
	puts("Enter strings, enter a newline to quit:");
	while(s_gets(s, LEN) && s[0] != '\0')
	{
		num = myatof(s);
		printf("String: %s, corrsponding number: %f.\n",s, num);
	}
	puts("Bye!");
	return 0;
}
char *s_gets(char *s, int n)
{
	char *ret, *find;
	ret = fgets(s, n, stdin);
	if(ret)
	{
		find = strchr(s, '\n');
		if(find)
			*find = '\0';
		else
			while(getchar() != '\n')
				continue;
	}
	return ret;
}
double myatof(const char *s)
{
	int sign, sign_e;//数值的符号,指数部分的符号
	int hasdot = 0;
	int hase = 0;
	double intpart = 0.0;//小数的整数部分
	double decpart = 0.0; //小数的小数部分
	int decdigit = 1; //小数的小数位数
	int exp = 0; //指数部分
	double ret;
	int i;
	//跳过开头的空格
	for (i = 0; isspace(s[i]); i++)
		;
	//判断符号,如有,跳过
	sign = (s[i] == '-') ? -1 : 1;
	if (s[i] == '-' || s[i] == '+')
		i++;
	//判断浮点数
	//第一部分:
	for (; s[i] != '\0'; i++)
	{
		if (isdigit(s[i])) //数字
			intpart = 10 * intpart + s[i] - '0';//计算小数的整数部分
		else if (s[i] == '.') //小数点
		{
			hasdot = 1;
			i++;
			break;
		}
		else if (s[i] == 'e' || s[i] == 'E') //科学计数符
		{
			hase = 1;
			i++;
			break;
		}
		else //非法字符
			return sign * intpart;
	}
	/*第一部分结束,有如下情况:
	1. 扫描数字知道非法字符或字符串结尾,2d 234
	2. 数字加小数点 2.
	3. 小数点 .
	4. 数字加科学计数符 3e
	5. 科学计数符 e   这种情况是非法表示,但最终计算的结果为0,
		因此可当作正常计算,不单独列出
	6. 非法字符, 直接退出
	*/

	//第二部分,接着上述情况扫描
	//能进入下面循环,排除遇到字符串结尾,非法字符
	//因此只能遇到点号或科学计数符
	for (; s[i] != '\0'; i++)
	{
		//第一种:.3 或 3.4,均为合法,计算小数的小数部分
		if (hasdot && isdigit(s[i]))
			decpart += (s[i] - '0') / pow(10, decdigit++);
		//第二种:.e 或 2.e 或 .2e 或 3.3e 第一种非法,但计算结果为0
		else if (hasdot && (s[i] == 'e' || s[i] == 'E'))
		{
			hase = 1;
			i++;
			break;
		}
		//第三种:第一部分以e结束,3e e
		else if (hase)
			break;
		//第四种:第一部分以点号结束,现在扫描非数字,非科学计数符的其他非法字符
		else
			return sign * (intpart + decpart);
	}
	/*第三部分
	从第二部分退出后继续后面的程序,有如下情况:
	以科学计算符 e 结束第二部分,前面有小数点或者没有
	小数部分计算完,下面讨论指数部分
	*/
	//判断指数部分符号
	sign_e = (s[i] == '-') ? -1 : 1;
	if (s[i] == '+' || s[i] == '-')
		i++;
	for(; s[i] != '\0'; i++)
	{
		if(isdigit(s[i]))
			exp = exp * 10 + s[i] - '0';
		else
			break;
	}
	ret = sign * ((intpart + decpart) * pow(10, sign_e * exp));
	return ret;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c 语言实现 atof() 函数 的相关文章

  • 论文中图片加方框 matlab代码

    转自 http blog csdn net majinlei121 article details 52334171 加方框函数 cpp view plain copy function I rgb DrawRectangle I Left
  • pymysql介绍

    一 数据库介绍 概念 一个存放数据的仓库 这个仓库按照一定的数据结构组织 存放 管理数据 分类 关系型数据库 mysql sql server oracle DB2等 非关系型数据库 redis等 python操作数据库的方式 pymysq
  • 传统制造型企业如何实现数字化转型?

    传统制造企业可以通过采用技术和数据驱动的方法来实现数字化转型 以改善运营 提高效率并在快速发展的行业中保持竞争力 以下是他们可以遵循的步骤和策略 1 评估和战略制定 评估当前状态 首先评估制造流程 技术基础设施和数据管理系统的当前状态 确定
  • XSS攻击绕过过滤方法大全(转)

    XSS攻击绕过过滤方法大全 约100种 文章目录 XSS攻击绕过过滤方法大全 约100种 1 XSS定位器 2 XSS定位器 短 3 无过滤绕过 4 利用多语言进行过滤绕过 5 通过JavaScript命令实现的图片XSS 6 无分号无引号
  • windows用 tree命令查看目录文件夹结构

    windows用 tree命令查看目录文件夹结构 查看帮助 tree help tree dirsfirst filelimit 6 h t dirsfirst 目录优先展示 filelimit 6 文件夹下超过6个文件的将不展开 s 以字
  • 启动mysql服务的时候一直报ERROR! The server quit without updating PID file

    问题背景 最近在电脑的vmware上安装了个CentOS 7系统 并在系统中装了mysql 8 0 11 可是启动服务的时候一直报错 如下 root localhost etc service mysql start Starting My
  • CloudCompare二次开发(1)——获取指定高程的所有点

    目录 一 源码编译 二 制作流程 三 结果展示 本文由CSDN点云侠原创 原文链接 爬虫网站自重 一 源码编译 1 WIN10系统下VS2019编译CloudCompare2 12 4 二 制作流程 1 找到源码中的插件例子 主要支持三种插
  • 类什么时候被加载 java

    创建对象实例时 new 创建子类对象实例 父类也被加载 使用类的静态成员时 静态属性 静态方法
  • 软件工程—软件结构图笔记详谈

    一 定义 结构图 Structure Chart 简称SC图 是精确表达软件结构的图形表示方法 它以特定的符号表示模块 模块间的调用关系和模块间信息的传递 二 主要构成 模块 Module 用矩形框表示 框中写有模块的名字 说明模块的功能
  • 服务器ie浏览器总是未响应,win7电脑IE浏览器总是未响应怎么办 IE浏览器无响应原因解决方法...

    win7电脑IE浏览器总是未响应怎么办 IE浏览器无响应原因解决方法 2016 12 05 已有人学习 编辑 chenwei 来源 电脑技术吧整理 win7电脑IE浏览器总是未响应怎么办 IE浏览器无响应原因解决方法 我们在使用电脑的时候
  • Linux mysql启动失败 Job for mysqld.service failed because the control process exited with error code.

    一 查询mysql无法启动问题 service mysql start 启动mysql 报错 Job for mysqld service failed because the control process exited with err
  • outlook邮箱邮件内容乱码_outlook邮件乱码怎么转换

    造成邮件乱码的原因很多 但归纳起来不外乎有三种情况 一是操作系统和使用的软件设置不同导致的 二是发送邮件时发送程序采用不同的编码标准 如UU MIME BINHEX等 而你所用的操作系统程序没有能力将其解码 收到的邮件像 天书 一般 三是邮
  • 《Graph Neural Networks Foundations,Frontiers and Applications》第一部分第一章第1.2.2节翻译和解读

    书名 Graph Neural Networks Foundations Frontiers and Applications 图神经网络的基础 前沿和应用 出版社 Springer Berlin Heidelberg 作者 Lingfei
  • chatgpt赋能python:Python中如何写π

    Python中如何写 在Python中 写 Pi 即圆周率 可能是一个小小的挑战 但是 这个问题的答案相对比较简单 在本文中 我们将介绍如何在Python中计算 以及如何使用Python的数学库 math库 介绍 是一个十分重要的数学常数
  • 决策树与R语言(RPART)

    关于决策树理论方面的介绍 李航的 统计机器学习 第五章有很好的讲解 传统的ID3和C4 5一般用于分类问题 其中ID3使用信息增益进行特征选择 即递归的选择分类能力最强的特征对数据进行分割 C4 5唯一不同的是使用信息增益比进行特征选择 特
  • 自动寻路算法C语言,C语言实现A*算法

    CopyRight c HYTC Ltd All rights reserved Filename main c Creator GaoLei Version 0 0 Date 2011 06 15 QQ 38929568 Descript
  • 微信小程序中使用svga动画

    参考资料 https github com svga SVGAPlayer Web tree mphttps github com svga SVGAPlayer Web tree mp 也可以参考 我主要参考的上面的 https gith
  • runtime交换方法的正确姿势

    runtime交换方法的正确姿势 说到Objective C大家就会想到黑魔法runtime 不知道runtime是什么的看这里 runtime是开源的 源码在这里 本文主要讲解如何利用runtime正确的交换方法 将会提到两种方式去交换
  • mysql中查询缓存优化以及慢查询

    1 概述 开启Mysql的查询缓存 当执行完全相同的SQL语句的时候 服务器就会直接从缓存中读取结果 当数据被修改 之前的缓存会失效 修改比较频繁的表不适合做查询缓存 2 操作流程 1 客户端发送一条查询给服务器 2 服务器先会检查查询缓存

随机推荐

  • 计算机科学与技术认知实验报告,15级计算机科学与技术三班林家铖实验报告-实验三.doc...

    15级计算机科学与技术三班林家铖实验报告 实验三 doc 1北京理工大学珠海学院实验报告ZHUHAICAMPAUSOFBEIJINGINSTITUTEOFTECHNOLOGY班级15级计算机3班学号150201101898姓名林家铖指导教师
  • APIpost简介

    文章目录 总述 下载地址 针对后端开发人员 针对前端开发人员 针对测试人员 针对研发经理 总述 ApiPost是一款支持模拟POST GET PUT等常见HTTP请求 支持团队协作 并可直接生成并导出接口文档的API 文档 调试 Mock
  • (原)tensorflow中提示CUDA_ERROR_LAUNCH_FAILED

    转载请注明出处 http www cnblogs com darkknightzh p 6606092 html 参考网址 https github com tensorflow tensorflow issues 6509 issueco
  • 亲密数对C++

    亲密数对 题目描述 给定两个不同的正整数a和b 如果a的因子 除了1和它本身 和等于b b的因子 除了1和它本身 和等于a 且a b 则a和b为一对亲密数 给定正整数N 求2 N中的亲密数对 输入 一个正整数N 2 N 20000 输出 输
  • glTexImage2D()

    函数定义 void glTexImage2D GLenum target GLint level GLint internalFormat GLsizei width GLsizei height GLint border GLenum f
  • MD5加密解密

    import java security MessageDigest import org apache commons codec digest DigestUtils import java math BigInteger Descri
  • 生成dll文件并供给unity使用

    先来一个脚本 本文就是将这个类打包成dll然后给unity使用 using System using System Collections Generic using System Linq using System Text 引入unit
  • 回归问题总结(梯度下降、线性回归、逻辑回归、源码、正则化)

    原文地址 http blog csdn net gumpeng article details 51191376 最近 应妹子要求 对回归问题进行了总结 网上相关资料很多 主要是针对Andrew Ng的在线课程写的笔记 但大部分都讲得不清晰
  • 在托管代码中重新发现丢失的内存优化艺术

    http www microsoft com china MSDN library netFramework netframework MemoryOptim mspx
  • Android Message Application -- SMS(一)

    SMS send ComposeMessageActivity 信息编辑 View 1 confirmSendMessageIfNeeded gt 是否收信人编辑 View 是否存在并已经显示 2 sendMessage gt 判断是否为紧
  • 为什么国内服务器带宽这么贵?

    带宽是对云服务器价格的影响也很大 它对访问速度和运行速度有很大的影响 尤其是同时在线访客数量的大小 也是有带宽决定 贵是有几个原因 1 首先 宽带是运营商管的 就是那三家垄断 价格没有可以谈的 2 做网站 应用等 你要考虑中国不同的人用不同
  • 《花雕学AI》ChatGPT Shortcut Chrome 扩展:让生产力和创造力加倍的 ChatGPT 快捷指令库

    你是否想要与一个智能的对话伙伴聊天 或者让它帮你完成各种任务 如写作 编程 摘要 翻译等 如果是的话 你可能会对 ChatGPT 感兴趣 ChatGPT 是一个基于 GPT 3 5 的对话式人工智能 可以与用户进行自然 流畅 有趣的对话 也
  • springboot使用默认的logback配置logback-spring.xml每天一个日志文件

    文章目录 logback application yml配置 logback spring xml内容 部署启动 2 application yml放在resources下 使用 logback springboot配置每天一个日志文件lo
  • 深度学习神经网络代码模板

    model文件 import torch from torch import nn class MyModel nn Module def init self super MyModel self init 在这里定义你的模型结构 self
  • 什么是 Git 和 Git Repository?(Python 在线运行实例)

    相信许多人都对 GitHub 一点都不陌生 即便不是程序员 我们也经常可以在 GitHub 上下载到非常优秀的开源软件 如果注意一下的话 我们会发现 GitHub 的名字是有 Git Hub 组成的 而有一些编程基础的同学可能也会听说过 G
  • java个人记账(非企业级应用)

    虽然很早就有写博客的打算 但时至今日才真正意义上开始 影响我写博客主要是有三件事吧 第一件就是以后面试时候可能不仅仅看你简历写什么而是看你博客和github上有什么 第二件是上家架构和我们说一项技术不是你学会如何使用而是教会别人怎么去使用
  • Vue 中 props 和 attrs 概念与区别

    Vue 中的区别 Vue中的 a t t r s 和 attrs和 attrs和listener Vue
  • 高斯消去法(线性方程组求解)

    问题描述 为求解一个线性方程组 首先构造增广矩阵 A B 采用偏序选主元策略的高斯消去法变换成上三角矩阵 再执行回代过程得到解 输入形式 在屏幕上依次输入方阵阶数n 系数矩阵A和常数矩阵B 输出形式 首先输出上三角矩阵 变换后的增广矩阵 然
  • 支付宝小程序&财富号&基金相关页面之间相关跳转

    支付宝小程序跳转 小程序跳转财富号 this global urlHandler alipays platformapi startapp appId xxxx00002019101768404279 query publicId 3Dxx
  • c 语言实现 atof() 函数

    c 语言实现 atof 函数 1 atof 函数介绍 浮点数的合法表达形式 测试自带 atof 函数 2 实现 atof 函数功能 1 atof 函数介绍 C 库函数 double atof const char str 属于库函数 std