从一个字符数组中取出相应的整数、实数

来源:互联网 发布:hbulider js无法跳转 编辑:程序博客网 时间:2024/05/24 15:43
/*
功能:从一个字符数组中取出相应的整数、实数
作者:班草
 */
#include <stdio.h>
#include <malloc.h>
#include <math.h>


void read_num( char *str , int *read_int , double *read_double); 


int main()
{
    char *str = NULL;
    int *read_int = NULL;
    double *read_double = NULL;
  
    str = (char *)malloc(sizeof(char)*1024); //分配堆空间
    read_int = (int *)malloc(sizeof(int)*1024);
    read_double = (double *)malloc(sizeof(double)*1024);
    
    printf("input string:"); //输入字符串
    scanf("%s",str);


    read_num( str , read_int , read_double ); //调用函数
    
    int i = 0;


    printf("int :"); //输出整型
    for( i = 1 ; i <= read_int[0] ; i ++ )
    {
        printf("\t%d",read_int[i]);
    }
    printf("\n");


    printf("double:"); //输出实型
    for( i = 1 ; i <= (int)read_double[0] ; i++ )
    {
        printf("\t%g",read_double[i]);
    }
    printf("\n");


    free(str); //释放堆空间
    str = NULL;
    free(read_int);
    read_int = NULL;
    free(read_double);
    read_double = NULL;


    return 0;
}
void read_num( char *str , int *read_int , double *read_double )
{
    int flag = 1;           //正负符号变量
    int read = 0;           //读标志,为1时表示读取到值
    int i_int = 1;          //整形数组的下标
    int i_double = 1;       //实形数组的下标


    read_int[0] = 0;        //数组第一个数,表示读取到的值的数量
    read_double[0] = 0;
    
    int x = 0;              
    int u = 0;
    int zi = 0;             //这三个变量用于将字符串数字转换为整形
    double fzi = 0.0;       //存放小数点后的数值


    while( *str != '\0' )   //遍历字符串
    {
        if( *str == '-' )   //判断是否为负号,
        {
            flag = -1;
            str ++;
        }


        for( x = 0 ; *str >= '0' && *str <= '9' ; x++ , str ++ )  //读取字符串中一段连续的数字,转换为整型
        {  //如125.6,读出为125
            u = *str - '0';
            if( x == 0 )
            {
                zi = u;
            }
            else
            {
                zi = zi * 10 + u;
            }
            read = 1;
        }
        if( *str == '.' && read == 1 )      //如果遇到小数点且小数点前为数字
        {
            str ++;
            for( x = 0 ; *str >= '0' && *str <= '9' ; x++ , str ++ )//读小数点后的值
            {
                u = *str - '0';
                if( x == 0 )
                {
                    fzi =(double)u / pow(10,x+1);
                }
                else
                {
                    fzi += (double)u / pow(10,x+1);
                }
            }
            if( fzi != 0.0 ) //如果小数点后读到了值,将其值转换为对应的实数然后加上前面的整数,存放到实型数组
            {
                read_double[0]++;
                read_double[i_double++] = (zi + fzi) * flag;
                read = 0;
            }
        }
        if( read == 1)      //判断是否读到值
        {
            read_int[0]++;
            read_int[i_int++] = zi * flag;
            read = 0;
        }
        flag = 1;
    }
}
阅读全文
0 0
原创粉丝点击