实现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 ...
随机推荐
- [JLOI2015]管道连接
题目描述 小铭铭最近进入了某情报部门,该部门正在被如何建立安全的通道连接困扰.该部门有 n 个情报站,用 1 到 n 的整数编号.给出 m 对情报站 ui;vi 和费用 wi,表示情报站 ui 和 v ...
- ●线段树题之wows
●模拟考试的一道似乎是学长出的题,还不错,挺考代码能力的.以此记录. ●题目以被上传(改了改说法),6128 Lence的方块们 ● (像手纸一样长的贴图……) ●题目大意: 有横向排布的n个点,每个 ...
- 线性规划与网络流24题●09方格取数问题&13星际转移问题
●(做codevs1908时,发现测试数据也涵盖了1907,想要一并做了,但因为“技术”不佳,搞了一上午) ●09方格取数问题(codevs1907 方格取数3) 想了半天,也没成功建好图: 无奈下 ...
- poj 1279 半平面交核面积
Art Gallery Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6668 Accepted: 2725 Descr ...
- glusterfs 4.0.1 api 分析笔记1
一般来说,我们写个客户端程序大概的样子是这样的: /* glfs_example.c */ // gcc -o glfs_example glfs_example.c -L /usr/lib64/ - ...
- oracle初试、函数、增删改查、多表查询
安装oracle后的测试以及解锁账户 安装后打开命令行,输入 sqlplus 回车后会提示输入用户名,输入 sys或者system 回车后输入密码,密码为安装or ...
- Missing URI template variable 'XXXX' for method parameter of type String
原因:就是spring的controller上的@RequestMapping的实参和方法里面的形参名字不一致 方法:改成一样就可. ps.还能用绑定的方法,不建议,因为太麻烦了 @RequestMa ...
- 使用RestTemplate访问restful服务时遇到的问题
可以通过通过wireshark抓包,使用Postman发送请求 wireshark是非常流行的网络封包分析软件,功能十分强大.可以截取各种网络封包,显示网络封包的详细信息.使用wireshark的人必 ...
- css修改浏览器默认的滚动条样式
//滚动条样式 ::-webkit-scrollbar { width: 10px; } /* 垂直滚动条的滑动块 */ ::-webkit-scrollbar-thumb:vertical { bo ...
- 模仿天猫实战【SSM版】——项目起步
前言:现在自己的学习似乎遇到了瓶颈,感觉学习了 SSM 之后有一些迷茫,不知道接下来该往哪里去努力了,我觉得这是个很不好的状态,为了度过这段时期,我准备把天猫模仿下来(给自己找点事做)之后开始去巩固 ...