/*
功能:从一个字符数组中取出相应的整数、实数
作者:班草
*/
#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;
}
}
功能:从一个字符数组中取出相应的整数、实数
作者:班草
*/
#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;
}
}