实现string到double的转换
分析:此题虽然类似于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的转换的更多相关文章
- double型转换成string型
double型转换成string型 题目描写叙述: 如有一个函数.其可接受一个long double參数,并将參数转换为字符串.结果字符串应保留两位小数,比如,浮点值123.45678应该生成&quo ...
- string与double的互相转换
#include <iostream> #include <string> #include <sstream> string DoubleToString(dou ...
- string和double之间的相互转换(C++)
很多人都写过这个标题的文章,但本文要解决的是确保负数的string和double也可以进行转换. 代码如下: string转double double stringToDouble(string nu ...
- 关于==和equals()方法&Java中string与char如何转换&String,StringBuffer
1.对于基本数据类型,可以直接使用==和!=进行内容比较 如:int x=30; int y=30; x==y; //true 基本数据类型 简单类型(基本类型) bo ...
- String转double失去精度问题
最近遇到一个坑,微信小程序中退款 19.9的字符串转double变成19.89,导致退不成功 . 坑死我了.现在把更改后的代码贴出来 public static void main(String[] ...
- 与String有关的强制转换
String --> int int i = Integer.parseInteger("123"); String --> double double d = Dou ...
- go中string和slice no-copy转换
在go里面,string和slice的互换是需要进行内存拷贝的,虽然在底层,它们都只是用 pointer + len来表示的一段内存. 通常,我们不会在意string和slice的转换带来的内存拷贝性 ...
- string 到 wstring的转换
string 到 wstring的转换_一景_新浪博客 string 到 wstring的转换 (2009-08-10 20:52:34) 转载▼ 标签: 杂谈 ...
- 利用Gson进行String和对象的转换
利用Gson进行String和对象的转换 /** * 从JsonStr中解析BUserBase * @param jsonStr * @return */ public static BUserBas ...
随机推荐
- HDU 5909 Tree Cutting
传送门 题意: 有一棵n个点的无根树,节点依次编号为1到n,其中节点i的权值为vi, 定义一棵树的价值为它所有点的权值的异或和. 现在对于每个[0,m)的整数k,请统计有多少T的非空连通子树的价值等于 ...
- 计蒜客NOIP模拟赛(2) D2T1 劫富济贫
[问题描述] 吕弗·普自小从英国长大,受到骑士精神的影响,吕弗·普的梦想便是成为一位劫富济贫的骑士. 吕弗·普拿到了一份全国富豪的名单(不在名单上的都是穷人),上面写着所有富豪的名字以及他们的总资产, ...
- [USACO17FEB]Why Did the Cow Cross the Road I S
题目描述 Farmer John's cows are trying to learn to cross the road effectively. Remembering the old " ...
- Codeforces Round #406 (Div. 1)
B题打错调了半天,C题想出来来不及打,还好没有挂题 AC:AB Rank:96 Rating:2125+66->2191 A.Berzerk 题目大意:有一个东东在长度为n的环上(环上点编号0~ ...
- [BSGS算法]纯水斐波那契数列
学弟在OJ上加了道"非水斐波那契数列",求斐波那契第n项对1,000,000,007取模的值,n<=10^15,随便水过后我决定加一道升级版,说是升级版,其实也没什么变化,只 ...
- 【Halum操作-UVA 11478】
·英文题,述大意: 输入有向图一个(什么边的端点啊,边权啊).每次可以选择一个节点和一个整数,然后把这个结点的出边边权加上该整数,入边边权减去该整数,目标:使得所有边的最小值非负且尽量大. ...
- Python【第三课】 函数基础
本篇内容 函数基本语法及特性 嵌套函数 递归函数 匿名函数 高阶函数 内置函数 1.函数的基本语法及特性 1.1 函数概念 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提 ...
- 腾讯笔试题:小Q硬币组合
腾讯有一道机试题: 大概意思是: 小Q非常富有,拥有非常多的硬币,小Q的拥有的硬币是有规律的,对于所有的非负整数K,小Q恰好> 各有两个数值为2^k,的硬币,所以小Q拥有的硬币是1,1,2,2, ...
- 华科机考:a+b
时间限制:1秒空间限制:32768K 题目描述 计算a+b的和 每行包行两个整数a和b 对于每行输入对应输出一行a和b的和 输入 1 5 输出 6 吐槽:这尼玛是机考题? 代码: #include & ...
- Python盗号原理-代码实现截屏键盘记录远程发送(不要做坏事)
这年头盗号的从出不穷,不是脱裤就是社工钓鱼.今天呢我们就以前面的几篇技术文章做铺垫,来讲一下python盗号的原理(学习用途,请勿用于违法犯罪),知己知彼方能百战不殆嘛. 脱裤我们就不多提了,无非就是 ...