提取字符串(C语言)
写个博客跨年啊(><)新年快乐!平平安安!
直接上图:
一看这种题目,就知道----好绕! 好多坑!这该死的细节!
- 坑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 <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
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;
}