从字符串中提取数值( 包括浮点格式数据)

作者在 2010-08-08 11:07:01 发布以下内容
// 目的:从字符串中提取数值( 包括浮点格式数据)

#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <malloc.h>
// 如果是小数点则必须保证这个位置的前面和后面中有有一个数字
// 如果是负号则要求

// 数据格式的限制(简化操作)
// 必须保证是符号开始的或者数字开始的制,如果是负号,则后面一定是数字
// 一直查询到非数字和小数点才结束

int process(char *str,double *data)
{
    int row = 0 ;
    for(int i=0;*(str+i)!='\0';i++)
    {
        int digitFlag = 0 ;
        // 确定首偏移地址
        if( isdigit(*(str+i)) || (isdigit(*(str+i+1))&&(*(str+i)=='-')) )
        {
            int j=1;
            char pointfrag = 2; // 一个数字中小数点不能为2
            i++;
            digitFlag=1;        // 表明是数字开端
            while( (digitFlag==1)&&(pointfrag>0) )
            {
                if( isdigit(*(str+i)) )//(*(p+i)>=48&&*(p+i)<=57)
                {
                    i++;        // 字符串位置偏移
                    j++;        // 有数数字个数计数值+1
                }
                else
                {
                    if( *(str+i)=='.' )        // 是小数点
                    {
                        pointfrag--;
                        i++; j++;
                    }
                    else        // 不是数字 也不是小数点
                    {
                        digitFlag=0 ;        // 退出循环
                        char buf[20];
                        for(int c=0; c<j; c++)
                        {
                            buf[c] = *(str-j+i+c);
                                // printf("%3d", (buf[c]-48) );
                        }
                        buf[c] = '\0';
                        printf("%.3lf\t",data[row]=atof(buf) );
                        row++ ;
                    }
                }
            }
        }
    }
    printf("\nthe total rows is %3d\n",row);
    return row;
}

void main()
{
    //int (*a)[10];
    //char a[10][10];
    double *data = (double *)malloc(sizeof(double)*10);
    char *numbers="a123*456 -17.9s.60?302ta -89.70 1111111111111212323";
    printf("%s\n",numbers);
    process(numbers,data);
}
算法 | 阅读 1650 次
文章评论,共0条
游客请输入验证码
浏览1970376次