分析:此题虽然类似于atoi函数,但毕竟double为64位, 而且支持小数,因而边界条件更加严格,写代码时需要更加注意。

#include <errno.h>
#include <float.h>
#include <stdio.h>
#include <stdlib.h>
#include "math.h"

enum status {
	invaild = 0, vaild
};
int g_status = vaild;

int isspace(const char* str) {
	return *str == ' ';
}

int isDigit(char num) {
	if (num >= '0' && num <= '9') {
		return 1;
	} else {
		return 0;
	}
}

//对atof函数进行扩充,使其可以处理科学计数法形式的字符如 123.45e-6
double strToDouble(const char* nptr) {

	double val = 0, power = 1;
	int exp = 0;

	if (nptr == NULL) {
		return 0;
	}
	g_status = invaild;
	//跳过空格
	while (*nptr == ' ') {
		nptr++;
	}

	int flag = *nptr == '-' ? -1 : 1;
	if (*nptr == '-' || *nptr == '+') {
		nptr++;
	}

	while (isDigit(*nptr)) {
		val = val * 10 + *(nptr++) - '0';
	}

	if (*nptr == '.') {
		nptr++;
	}

	while (isDigit(*nptr)) {
		val = val * 10 + *(nptr++) - '0';
		power *= 10;
	}

	val = val / power;

	if (*nptr == 'e' || *nptr == 'E') {
		nptr++;
		int eflag = *nptr == '-' ? -1 : 1;
		if (*nptr == '-' || *nptr == '+') {
			nptr++;
		}
		while (isDigit(*nptr)) {
			exp = exp * 10 + *(nptr++) - '0';
		}

		//是否越界
//		 else

		if (eflag == 1) {
			if (val > DBL_MAX * pow(10.0, (double) -exp)) {
				return DBL_MAX;
			}
			while (exp-- > 0) {
				val *= 10;
			}
		} else if (eflag == -1) {
			if (val < DBL_MIN * pow(10.0, (double) exp)) {

				return DBL_MIN;
			}
			while (exp-- > 0) {
				val /= 10;
			}
		}
	}

	if (*nptr == '\0') {
		g_status = vaild;
	}
	return flag * val;

}

int main(void) {
//	DBL_MIN: 2.2250738585072014e-308
//	DBL_MAX: 1.7976931348623157e+308
	setvbuf(stdout, NULL, _IONBF, 0);
	char str[100] = "1.79e308";
	double num;
	num = strToDouble(str);
	if (g_status) {
		printf("%.16e\n", num);
	} else {
		printf("%s", "invaild input!!!");
	}

	return EXIT_SUCCESS;
}

实现string到double的转换的更多相关文章

  1. double型转换成string型

    double型转换成string型 题目描写叙述: 如有一个函数.其可接受一个long double參数,并将參数转换为字符串.结果字符串应保留两位小数,比如,浮点值123.45678应该生成&quo ...

  2. string与double的互相转换

    #include <iostream> #include <string> #include <sstream> string DoubleToString(dou ...

  3. string和double之间的相互转换(C++)

    很多人都写过这个标题的文章,但本文要解决的是确保负数的string和double也可以进行转换. 代码如下: string转double double stringToDouble(string nu ...

  4. 关于==和equals()方法&Java中string与char如何转换&String,StringBuffer

    1.对于基本数据类型,可以直接使用==和!=进行内容比较 如:int x=30;        int y=30;         x==y;  //true 基本数据类型 简单类型(基本类型) bo ...

  5. String转double失去精度问题

    最近遇到一个坑,微信小程序中退款 19.9的字符串转double变成19.89,导致退不成功 . 坑死我了.现在把更改后的代码贴出来 public static void main(String[] ...

  6. 与String有关的强制转换

    String --> int int i = Integer.parseInteger("123"); String --> double double d = Dou ...

  7. go中string和slice no-copy转换

    在go里面,string和slice的互换是需要进行内存拷贝的,虽然在底层,它们都只是用 pointer + len来表示的一段内存. 通常,我们不会在意string和slice的转换带来的内存拷贝性 ...

  8. string 到 wstring的转换

    string 到 wstring的转换_一景_新浪博客     string 到 wstring的转换    (2009-08-10 20:52:34)    转载▼    标签:    杂谈    ...

  9. 利用Gson进行String和对象的转换

    利用Gson进行String和对象的转换 /** * 从JsonStr中解析BUserBase * @param jsonStr * @return */ public static BUserBas ...

随机推荐

  1. noip2017"退役"记

    day0 口胡了一下去年的六道题,感觉很稳,看了6集动漫,0点钟就去睡了. day1 早上被一阵革命练习曲吵醒,而我还是窝在被子里不想起床(-﹃-)~zZ.于是室友开始放起了lost river... ...

  2. [HNOI2006]超级英雄

    题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回答一道题后,才 ...

  3. 【QAQ的Minecraft】

    树套树被QAQ用木斧挖了,只剩二维RMQ了. 题目:      QAQ最近爱上了一款很平凡的游戏,叫做<Minecraft>.目前游戏更新到了1.12版本,他发现了一条新的指令:/fill ...

  4. bzoj3561DZY Loves Math VI

    3561: DZY Loves Math VI Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 503  Solved: 333[Submit][Sta ...

  5. [Noi2013]矩阵游戏

    来自FallDream的博客,未经允许,请勿转载,谢谢. 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i ...

  6. BZOJ 4727: [POI2017]Turysta

    4727: [POI2017]Turysta Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 117  Solved ...

  7. 谷歌开发者:看可口可乐公司是怎么玩转TensorFlow的?

    在这篇客座文章中,可口可乐公司的 Patrick Brandt 将向我们介绍他们如何使用 AI 和 TensorFlow 实现无缝式购买凭证. 可口可乐的核心忠诚度计划于 2006 年以 MyCoke ...

  8. Spring MVC运行流程

    一.配置阶段 ①web.xml ②DispatcherServlet    //Spring MVC总入口 ③配置初始化参数   //classpath:application.xml,用于配置无数个 ...

  9. display显示方式

    元素的diplay显示方式有多种,隐藏.块级.内联.内联-块级. 1.display:none   隐藏 2.display:block; 表示块级元素. 块级元素会自动在前面和后面加上换行,并且在其 ...

  10. Java获取随机数的3种方法

    最小值---最大值(整数)的随机数     方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1)) 例: (int)(1+Math.random()*(10-1+1)) / ...