文字列の抽出(C言語)
ブログを書く大晦日(> <)明けましておめでとう!安全!
写真に直接:
この種のトピックを見ると、ご存知のとおり、とても簡単です。たくさんのピット!このいまいましい詳細!
- ピット1:xxx.42xxx出力0.42
- ピット2:
xxx123456xxx
出力123456
-
xxx123.456xx出力123.456 - 詳細1:数字を抽出する方法は?
- 詳細2:浮動小数点数を並べ替える方法は?
ガン、私はxxxを書くのをやめました、そしてプレッシャーの下で、私はまだ頭を悩ませて出てきました(Crying Haw、
ナンセンスな話をしないで、思考の列に行ってください:
1.準備
- 複数行入力の終了は、EOF、つまりctrl + zによって判断されます。
- 2次元配列を開き、抽出された数値文字列を格納します:m [j] [k]
- atof関数を使用して、文字列を浮動小数点数に変換し、それを二重配列num [35]に格納します。(atofがdoubleを返すことに注意してください。フロートだと思ったので、エラーを起こしました)
- qsortを使用してソートし、注意してください
。voidqsort(void * base、size_t nitems、size_t size、int(* compare)(const void *、const void *))
compar関数はint型を返すため、そのバリアントを変更します。
return *(double *)a < *(double *)b ? 1 : -1;
2.主要部分
- isdigit関数を使用して、それが数値であるかどうかを判別し、抽出を開始します
- 行の最後が数字の場合は、フラグを設定します。
f = 1;
次の行に渡し、次の行の先頭が数字かどうかを判断してから、元の抽出された数字の末尾に(k)を追加し続け、数字の数の増分を撤回します(j) :
k += 1; j -= 1;
- 数値に遭遇した場合は、最初に0を追加してから、数値の抽出に切り替えて、フラグも設定します。
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;
}