提取字符串(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 *