码迷,mamicode.com
首页 > 编程语言 > 详细

从字符串中提取数字串并排序(C语言实现)

时间:2017-05-22 20:04:24      阅读:432      评论:0      收藏:0      [点我收藏+]

标签:长度   null   else   efi   include   log   输出   while   sep   

#include "stdio.h" 
#include "stdlib.h"
#include "string.h" 

typedef int BOOL;
#define TRUE  1;
#define FALSE 0;

static void SplitBySeparator( char **arr, char *str, int size, char sep);

void SortNums        ( char*  str,     int size,  int cnt);
int  CompareDigStr   ( char*  digStr1, char* digStr2);

/*
从字符串中提取数字串并排序, 其中:
参数:
   str      字符串
   length   字符串长度, 若 < 0 则为 str 以 ‘\0‘ 结尾
   dest     存放数字串的缓冲区
   size     传入 dest 缓冲区的尺寸, 并返回数字串的长度
返回值:
   -2       提取失败, 存放数字串的缓冲区尺寸太小
   -1       提取失败, 参数不合法
    0       提取失败, 无数字串
   >0       提取成功, 返回数字串的项数
*/
int ExtractNums(const char* str, int length, char* dest, int* size)
{
   int   result    = -1;
   int   sizeDest  = 0;     // 数字串长度
   int   cntDest   = 0;     // 数字串的项数(cntDest+1)
   BOOL  isNeedSep = FALSE; // 是否需要分隔符
   char  ch;

   if (str != NULL && dest != NULL && size != NULL && *size > 0)
   {
      if (length < 0)           // str 以 ‘\0‘ 结尾
      {
         while(*str != \0)
         {
            ch = *str;
            if (ch >= 0 && ch <= 9)
            {
               // 分隔符
               if (isNeedSep)
               {
                  if (sizeDest >= *size)
                  {
                     result = -2;  // 提取失败, 存放数字串的缓冲区尺寸太小
                     break;
                  }
                  dest[sizeDest++] =  ;   // 分隔符
                  cntDest ++;
                  isNeedSep = FALSE;
                  
               }

               // 数字项
               if (sizeDest >= *size)
               {
                  result = -2;   // 提取失败, 存放数字串的缓冲区尺寸太小
                  break;
               }
               dest[sizeDest++] = ch;
            }
            else if (!isNeedSep && sizeDest > 0)
            {       
               isNeedSep = TRUE; // 下一数字项前需要加分隔符
            }
            str ++;
         }
      }
      else
      {
         for (int i=0; i<length; i++)
         {
            ch = str[i];
            if (ch >= 0 && ch <= 9)
            {
               // 分隔符
               if (isNeedSep)
               {
                  if (sizeDest >= *size)
                  {
                     result = -2;  // 提取失败, 存放数字串的缓冲区尺寸太小
                     break;
                  }
                  dest[sizeDest++] =  ;   // 分隔符
                  cntDest ++;
                  isNeedSep = FALSE;

               }

               // 数字项
               if (sizeDest >= *size)
               {
                  result = -2;   // 提取失败, 存放数字串的缓冲区尺寸太小
                  break;
               }
               dest[sizeDest++] = ch;
            }
            else if (!isNeedSep && sizeDest > 0)
            {       
               isNeedSep = TRUE; // 下一数字项前需要加分隔符
            }
         }
      }


      // 输出缓冲区太小则不进行排序
      if (result != -2)
      {
         *size = sizeDest;       // 数字串的长度

         // 数字项大于1才进行排序
         if (++cntDest > 1)
         {
            SortNums(dest, sizeDest, cntDest);
            result = cntDest;    // 返回数字串的项数
         }
         else if (sizeDest != 0) // 只有一个数字项
         {
            result = cntDest;
         }
         else
            result = 0;          // 无数字串
      }
   }
   return result;
}

/*
数字字符串串排序(从小到大), 其中:
参数:
   str      数字字符串
   size     数字字符串长度
   cnt      数字串项数
返回值:
   无
*/
void SortNums(char* str, int size, int cnt)
{
   char** arrStr   = NULL;   // 二级指针,用于存放分割提取好的数字项
   char*  strDest  = NULL;   // 待分隔数字串
   char*  arrTmp   = NULL;
   int    nLen     = 0;      // 数字项长度
   BOOL   isSorted = FALSE;


   if (str != NULL && size > 0)
   {
      strDest = (char*)malloc(size+1);
      
      if (strDest != NULL)
      {
         arrStr  = (char**)malloc(cnt*sizeof(char *)); // 申请cnt个指针保存数字项地址
         if (arrStr != NULL)
         {
            memcpy(strDest, str, size);
            *(strDest+size) = \0; 

            // 提取数字项
            SplitBySeparator(arrStr, strDest, size,  );

            // 冒泡排序
            for(int i=0; i<cnt-1; i++)
            {
               isSorted = TRUE;
               //每一轮比较前cnt-1-i个,即已排序好的最后i个不用比较
               for(int j=0; j<cnt-1-i; j++)
               {
                  if(CompareDigStr(arrStr[j], arrStr[j+1]) == 1)
                  {
                     isSorted    = FALSE;
                     arrTmp      = arrStr[j];
                     arrStr[j]   = arrStr[j+1];
                     arrStr[j+1] = arrTmp;
                  }
               }
               if(isSorted) break; // 没有发生交换,排序已完成   
            }

            // str返回排序结果
            nLen = strlen(arrStr[0]);
            memcpy(str, arrStr[0], nLen);
            str += nLen;
            for(int i=1; i<cnt; i++)
            {
               *str =  ;
               str ++;
               nLen = strlen(arrStr[i]);
               memcpy(str, arrStr[i], nLen);
               str += nLen;
            }
            free(arrStr);
         }
         free(strDest);
      }
   }
}

/*
提取数字项(static静态函数), 其中:
参数:
   arr      返回提取好的数字项
   str      数字串
   size     数字串长度
   sep      分隔符
返回值:
   无
*/
void SplitBySeparator( char **arr, char *str, int size, char sep)
{
   char* pEnd = str + size;
   for (*arr = str; str < pEnd; str++)
      if (*str == sep)
      {
         *str = \0;
         *(++arr) = str + 1;
      }
}

/*
比较数字串大小, 其中:
参数:
   digStr1  数字串1
   digStr2  数字串2
返回值:
    <0      digStr1小于digStr2
    0       digStr1等于digStr2
    >0      digStr1大于digStr2
*/
int CompareDigStr(char* digStr1, char* digStr2)
{
   int result  = -1;
   int dig1Len = 0;
   int dig2Len = 0;
   
   if (digStr1 != NULL && digStr2 != NULL)
   {
      // 除数字串头‘0’
      while(*digStr1 == 0)
      {
         digStr1 ++;
      }

      while(*digStr2 == 0)
      {
         digStr2 ++;
      }

      dig1Len = strlen(digStr1);
      dig2Len = strlen(digStr2);

      if (dig1Len > dig2Len)
      {
         result = 1;
      }
      else if (dig1Len == dig2Len)
      {
         result = strncmp(digStr1, digStr2, dig1Len);
      }
   }
   return result;
}

 

从字符串中提取数字串并排序(C语言实现)

标签:长度   null   else   efi   include   log   输出   while   sep   

原文地址:http://www.cnblogs.com/kyle-he/p/6890980.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!