提取字符串(C语言)

提取字符串(C语言)

写个博客跨年啊(><)新年快乐!平平安安!
直接上图:
提取字符串(C语言)_第1张图片
一看这种题目,就知道----好绕! 好多坑!这该死的细节!

  • 坑1: xxx.42xxx 输出0.42噢
  • 坑2:
    xxx123
    456xxx 输出123456噢
    -xxx123
    .456xx 输出123.456噢
  • 细节1:怎么提取数字?
  • 细节2:浮点数怎么排序?

淦,不写了xxx,迫于压力,还是绞尽脑汁撸出来了(哭唧唧
不说废话,上思路:

1.准备工作

  • 多行输入的结束通过判断EOF,即ctrl+z
  • 开个二维数组存所提取的数字字符串:m[j][k]
  • 用atof函数将字符串转为浮点数,并用double的数组num[35]储存。(注意atof是返回double,我以为是float然后出错了)
  • 用qsort进行排序,注意到:
    void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *))
    compar函数返回的是int类型,所以将其变式:
    return *(double *)a < *(double *)b ? 1 : -1;

2 .主体部分

  • 用 isdigit函数判断是否为数字,开始提取
  • 如果该行最后一个是数字的话,立个flag:
    f = 1;
    交给下一行,并判断下一行开头是否为数字,是就在原提取的数字末尾继续添加(k), 并撤回数字个数(j)的递增:
    k += 1; j -= 1;
  • 如果遇见.数字的情况,在开头补0,然后再转入数字的提取,同样立个flag:
    f1 = 1;

3 .代码部分

#include 
#include 
#include 
#include 
#include 
int j=0, k=0, f=0, f1=0, sum=0;
char m[35][25] = {"0"};        //m[j][k]数字字符串数组,j为数字的个数,k为数字的长度 
double num[35] = {0};
int cmp(const void *a, const void *b)    //降序排序 
{
    return *(double *)a < *(double *)b ? 1 : -1;
}

double *find(char str[])
{
	int n, a=0, i=0;
	n = strlen(str);
	for(i = 0; i < n; i++)
	{	
		if(i == 0)         //判断上一行是否为数字  是f=1 
		{
			if(f && (isdigit(str[i]) || str[i] == '.'))   //该行开头为数字或小数点 
			{
				k += 1;         //接在上一行提取的数字后面 
				j -= 1;         //不要递增,还是上一个提取的数 
				if(str[i] == '.')
				{
					m[j][k] = str[i];
					k++;
				}	         //此时f未归0,为了避免与.数字的情况冲突 
			}
			else       //如果该行开头不是数字或小数点,归0 
			{
				k = 0;
				f = 0;
			}
		}
		if(!(isdigit(str[i-1])) && str[i] == '.' && f == 0)    //出现.数字的情况,接下来处理为0.数字 
			f1 = 1;
		if(isdigit(str[i]) || f1 == 1)    //如果是数字或者是.数字 
		{
			f = 0;     //将可能未归0的f归0 
			if(f1 == 1)
			{
				m[j][k] = '0';   //加0 
				k++;
				f1 = 0;
			}
			m[j][k] = str[i];   //存第一个数字 
			i++;
			if(i == n)   //如果是一行的最后一位 
			{
				f = 1;
				j++;      //默认存完一串数字就递增 
			}
			for(a = i; a < n; a++)  //存接下来的数字 
			{
				if(isdigit(str[a]) || (str[a] == '.' && isdigit(str[a+1])))  //第二个括号判断条件舍去了数字.的情况 
				{
					k++;
					m[j][k] = str[a];     //存 
					if(a == n-1)     //直到一行最后一位 
					{
						j++;
						f = 1;
					}	
				}
				else     //存结束了 
				{
					k = 0;
					j++;
					i = a-1;
					break;
				}
			}
			
		}
		if(a == n)      //如果a增到结尾,就让i跳出循环,避免重复计算 
			i = n-1;
	}
	for(i = 0; i < j; i++)        //字符串转为浮点数 
		num[i] = atof(m[i]);
	return num;
}

int main(void)
{
	char str[1000] = {"0"};
	while(scanf("%s",str)!=EOF)
		find(str);
	qsort(num, j, sizeof(num[0]), cmp);
	printf("%.2f",num[0]);
	for(int i = 1; i < j; i++)
		printf(" %.2f",num[i]);
	printf("\n"); 
	return 0;
}

你可能感兴趣的:(典型题目,c语言,字符串)