| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1068 人关注过本帖
标题:简易制作字符选择器~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
 问题点数:0 回复次数:4 
简易制作字符选择器~
很久很久之前就已经自己做了个简易字符选择器了~可以在字符串中筛选与正则表达式匹配的子串(不过没有加自定义输入格式的异常处理)~~可以凑合看看~

程序代码:
/*字符选择器---sscanf-static-字符指针作形参的应用*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void judge_2(char **pt)
{
    char ch=0;
    printf("选择:\n1:过滤小写字母\n2:过滤大写字母\n");
    printf("3:过滤大小写字母\n按其它:退出\n");

    scanf("%c",&ch);

     if (ch!='\n')
        while (getchar()!='\n');

    switch(ch)
    {
        case'1':*pt="%[a-z]";break;
        case'2':*pt="%[A-Z]";break;
        case'3':*pt="%[a-zA-Z]";break;
        default:exit(0);
    }
}
void judge(char **pt)
{
    static char choice[50];
    char ch=0;
    printf("选择\n1:过滤字母\n2:过滤数字\n3:过滤其它字符\n4:只留下其他字符\n");
    printf("5:手动输入过滤条件\n按其它:结束程序\n");
    scanf("%c",&ch);

     if (ch!='\n')
        while (getchar()!='\n');

    switch(ch)
    {
        case'1':judge_2(pt);return;
        case'2':*pt="%[0-9]";return;
        case'3':*pt="%[0-9a-zA-Z]";return;
        case'4':*pt="%[^0-9a-zA-Z]";return;
        case'5':break;
        default:exit(0);
    }

    printf("请输入过滤格式(%%[(过滤内容)])\n");
    scanf("%[^\n]%*c",choice);

    *pt=choice;
}
void fun(char a[],char b[])
{
    char *p1=NULL;
    char *p2=NULL;
    char *pt=NULL;
    judge(&pt);

    for (p1=a,p2=b;*p1!='\0';p1++)
        if (sscanf(p1,pt,p2)!=0)
        {
            p1+=b+strlen(b)-p2-1;
            p2=b+strlen(b);
        }
    if (strlen(b))
        printf("过滤字符后的结果为\n%s\n",b);
    else
        printf("没有字符需要过滤或者输入格式不正确\n原字符为\n%s\n",a);
}
int main()
{
    char a[]="12sf345EsT*^^fe&#q6$#a7ACXdssf4";//内容可以自行修改
    char* b=(char* )malloc(strlen(a)*sizeof(char));
    memset(b,0,strlen(a)*sizeof(char));

    fun(a,b);
    free(b);

    return 0;
}


[此贴子已经被作者于2017-5-31 01:52编辑过]

搜索更多相关主题的帖子: 制作 字符串 表达式 
2017-05-30 23:44
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
囧~之前竟然没有养成及时释放空间的习惯~这里造成了内存泄露~~这个要注意一下了~~

程序代码:
int main()
{
    char a[]="12sf345EsT*^^fe&#q6$#a7ACXdssf4";//内容可以自行修改
    char *b=a;
    b=(char *)malloc(sizeof(a));
    fun(a,b);
    return 0;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-31 00:08
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
这个程序用%s测试会出问题,关键是%s会跳过读取空白字符造成和该算法模式不一致,而且那几行核心代码不好理解~简单而巧妙的解决方案是strcpy一个format格式后面strcat一个%n用来统计实际读取字符个数,这样应该可以了~

[此贴子已经被作者于2018-4-5 01:09编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-05 01:04
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 楼主 九转星河
"  -+-3  +-+34- + \t-7+ \t 4- \n 3+1-+-   +-1+-+2-4 \n \t -1"


用%s进行格式化这行代码出现问题,改~

[此贴子已经被作者于2018-4-5 01:08编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-05 01:07
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
附加通过测试代码~

程序代码:
void Common_StrFilter(const char* str,const char* _format,char** _buf)
{
    char* buf=NULL;
    char* format=NULL;
    
    size_t n;
    
    IS_EFAULT_RET(_buf,;);    
    
    IS_ERR(!str,;);
    IS_ERR(!_format,;);
    
     /*这里开大了一点,某测试环境开个+3有可能会出bug(释放资源出现问题)?~*/
    Common_Node_Mal(( void** )&format,0,strlen(_format)+8); 
    
    IS_ERR(!format,;);
    
    strcpy(format,_format);
    strcat(format,"%n");
    
    *_buf=strdup(str);
    
    IS_ERR(!str,;);
    
    buf=*_buf;
           
    for (;*str;++str)
        if (sscanf(str,format,buf,&n))
        {
            str+=n-1;
            buf+=strlen(buf);
        }

 
    *buf='\0';
    
    Common_Node_Free((void**)&format);
    
    Common_Node_Rea(( void** )_buf,strlen(*_buf)+1);
    
}


Common.h

程序代码:
#ifndef _COMMON_H_
#define _COMMON_H_

#include<stdio.h>


#ifdef __cplusplus
extern "C"
{
#endif

#define ERR_RET (RET) return RET;

#define IS_ERR(E,RET)    \
    do    \
    {    \
        if (E)    \
            return RET;    \
    }while (0)    

#define COMD_SUCCESS errno==0  

#ifndef NDEBUG 
#include<assert.h>

#define CHECK_COND(COMD,err,ISERROR)    \
    do    \
    {   \
        assert(COMD);    \
    }while (0)

#else

void Common_ThrowErr(int err,const char* );

#define  CHECK_COND(COMD,err,ISERROR)    \
    do    \
    {    \
        if (!(COMD))    \
        {    \
            Common_ThrowErr(err,#COMD);    \
            ISERROR    \
        }    \
    }while(0)

#endif

#define IS_EFAULT_RET(E,RET) CHECK_COND(E,EFAULT,ERR_RET(RET))


/*****达夫设备*****/
#ifndef DUFF_DECIVE
#define DUFF_DECIVE(NUM,E)    \
{    \
    unsigned int _Duff_Decive_Time=NUM>>3;    \
    \
    if (NUM>0)    \
        switch (NUM&7)    \
        {    \
            do    \
            {    \
                case 0:    E;    \
                case 1:    E;    \
                case 2:    E;    \
                case 3:    E;    \
                case 4:    E;    \
                case 5:    E;    \
                case 6:    E;    \
                case 7:    E;    \
            }while (--_Duff_Decive_Time>0);    \
        }    \
}
#endif

/******COMMON_NODE****/

void Common_Node_Mal(void** ,int ch,size_t size );

void Common_Node_Rea(void** ,size_t);

void Common_Node_Free(void** );


typedef const struct FUN_NODE   
{    
    void (*Mal)(void** ,int ch,size_t size );   
    void (*Rea)(void** ,size_t);    
    void (*Free)(void** );    
}FUN_NODE;

extern FUN_NODE fun_node;

/******COMMON_STRING****/

char* Comon_String_Get(FILE* ,char** ,int );

void Common_Swap(void* ,void* ,size_t );

char* Common_StrstrByKMP(const char* ,const char* ,const int** );

void Common_StrFilter(const char*,const char*,char**);

typedef const struct FUN_STRING   
{    
    char* (*Get)(FILE* ,char** ,int );
    void (*Swap)(void* ,void* ,size_t );
    char* (*StrstrByKmp)(const char* ,const char* ,const int** );
    
    void (*StrFilter)(const char*,const char*,char**);
}FUN_STRING;

extern FUN_STRING fun_string;

#ifdef __cplusplus
}
#endif

#endif


Common.c

程序代码:
#include "Common.h"

#include<stdlib.h>
#include<string.h>
#include<errno.h>


#ifdef NDEBUG

void Common_ThrowErr(int err,const char* comd)
{
    printf("\n\nAssertion failed: %s file %s, line %d\n",comd,__FILE__,__LINE__);    
            printf("\a\a\a\nError: %s\n\n",strerror(err));    
            getchar();    
}

#endif

FUN_NODE fun_node=     
{    
        Common_Node_Mal,    
        Common_Node_Rea,    
        Common_Node_Free    
};

FUN_STRING fun_string=
{    
        Comon_String_Get,
        Common_Swap,
        Common_StrstrByKMP,
        Common_StrFilter
};

static int* _InitKMPNext(const char* );

void Common_Node_Mal(void** p,int ch,size_t size)
{
     IS_EFAULT_RET(p,;);
    
    *p=malloc(size);

 CHECK_COND(COMD_SUCCESS,errno,ERR_RET(NULL));

    memset(*p,ch,size);
}

void Common_Node_Rea(void** p,size_t size)
{
    void* p_new=NULL;
    IS_EFAULT_RET(p,;);
    
    p_new=realloc(*p,size);

 CHECK_COND(COMD_SUCCESS,errno,Common_Node_Free(p);ERR_RET(NULL));

 
     *p=p_new;
}

void Common_Node_Free(void** node)
{
    IS_EFAULT_RET(node,;);

    free(*node);
    *node=NULL;
}

char* Comon_String_Get(FILE* fp,char** p,int userEof)
{
    int i=0;
    int c=0;
    int n=BUFSIZ;

    char* q=NULL;
    
    Common_Node_Mal((void**)&q,0,BUFSIZ);
        
    for (;(c=fgetc(fp))!=userEof&&c!=EOF;q[i++]=c)
        if (i+2>n)
        {
             Common_Node_Rea((void** )&q,n+=BUFSIZ);

            if (q==NULL)
                return NULL;
        }

    Common_Node_Rea((void** )&q,sizeof(char)*(i+1));

    if (q==NULL)
        return NULL;

    q[i]='\0';
    *p=q;

    return q;
}

void Common_Swap(void* p1,void* p2,size_t size)
{
    void* pt=NULL;

    IS_EFAULT_RET(p1,;);
    IS_EFAULT_RET(p2,;);

    Common_Node_Mal((void** )&pt,0,size);

    memcpy(pt,p1,size);
    memcpy(p1,p2,size);
    memcpy(p2,pt,size);

    Common_Node_Free(&pt);
}

char* Common_StrstrByKMP(const char* str,const char* sub,const int** p_next)
{
    int* next=NULL;
    
    size_t i=0;
    size_t j=0;
    size_t len=0;
    
   
   if (!sub)
       return NULL;
        
   if (p_next==NULL||*p_next==NULL)
   {
              next=(int* )_InitKMPNext(sub);
              
              if (next==NULL)
                  return NULL;
   }
   
   else
       next=(int* )*p_next;
      
  len=next[0];
  next[0]=-1;

   while (str[i]!='\0'&&j!=len)
       if (j==-1||str[i]==sub[j])
       {
           ++i;
           ++j;
       }
       else
           j=next[j];
   

   if (p_next==NULL)
    {
       free(next);
        next=NULL;
    }
    else
    {
        *p_next=next;
        next[0]=len;
    }

    return j==len?(char* )&str[i-len]:NULL;
}

static int* _InitKMPNext(const char* sub)
{
    size_t i=1;
    size_t j=0;
    size_t len=strlen(sub);
    
    int* next=NULL;
    
     Common_Node_Mal((void** )&next,0,sizeof (char )*(len+1));
    
    if (next==NULL)
        return NULL;
   
   while (sub[i]!='\0')
      if (sub[i]==sub[j])
           next[++i]=next[++j];
       else
       {
           next[i+1]=++j;
           while ( (j=next[j])&&sub[i]!=sub[j-1]);
           
           ++i;
       }
           
    next[0]=len;

    return next;
}

void Common_StrFilter(const char* str,const char* _format,char** _buf)
{
    char* buf=NULL;
    char* format=NULL;
    
    size_t n;
    
    IS_EFAULT_RET(_buf,;);    
    
    IS_ERR(!str,;);
    IS_ERR(!_format,;);
    
    Common_Node_Mal(( void** )&format,0,strlen(_format)+8);
    
    IS_ERR(!format,;);
    
    strcpy(format,_format);
    strcat(format,"%n");
    
    *_buf=strdup(str);
    
    IS_ERR(!str,;);
    
    buf=*_buf;
           
    for (;*str;++str)
        if (sscanf(str,format,buf,&n))
        {
            str+=n-1;
            buf+=strlen(buf);
        }

 
    *buf='\0';
    
    Common_Node_Free((void**)&format);
    
    Common_Node_Rea(( void** )_buf,strlen(*_buf)+1);
    
}


[此贴子已经被作者于2018-4-5 01:19编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-04-05 01:13
快速回复:简易制作字符选择器~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027130 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved