根据下面对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;
- }