根据下面对double数的定义,编写一个函数去parse一个字符串至double
double数指数部分(即e/E后面的数字),若没有应该为false,但是照这图画的意思,e/E后面若不跟数字也可以。下面的程序则处理为false
#include <stdio.h>
#include <assert.h>
#define bool int
#define false 0
#define true 1
bool isNum(const char ch)
{
if ((ch<='9')&&(ch>='0'))
return true;
else
return false;
}
bool ParseNumber(const char *s, double *d)
{
int i = 0;
int a = 0, b = 0;
double c = 0.0, f = 10.0; // -a.cE(e)(+/-)b
int flag1 = 1, flag2 = 1; // 1表示正,-1表示负
if (s[i] == '-') {
flag1 = -1;
i++;
}
if (s[i] == 0) {
i++;
}
else if ((s[i]<='9') && (s[i]>='1')) {
a += s[i] - '0';
while (isNum(s[++i])) {
a = a*10 + s[i] - '0';
}
}
if (s[i] == '.') {
while (isNum(s[++i])) {
c += (s[i]-'0')/f;
f *= 10.0;
}
}
if ((s[i] == 'e') || (s[i] == 'E')) {
i++;
if (s[i] == '+') {
i++;
}
else if (s[i] == '-') {
flag2 = -1;
i++;
}
if (!isNum(s[i])) //e(E)后面没有数字则错误
return false;
while (isNum(s[i])) {
b = b*10 + s[i] - '0';
i++;
}
}
if (s[i] == '\0') {
c += a;
if (flag1 == -1)
c = -c;
if (flag2 == -1) {
while (b--)
c /= 10.0;
}
else {
while (b--)
c *= 10.0;
}
*d = c;
return true;
}
else
return false;
}
int main(void)
{
double d;
assert(ParseNumber("10.25e+12", &d));
assert(d == 10.25e+12);
assert(!ParseNumber("101.01e-", &d));
return 0;
}