文字列の抽出(C言語)

文字列の抽出(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;
}

おすすめ

転載: blog.csdn.net/X_To_Y/article/details/112056269