zoukankan      html  css  js  c++  java
  • 状态机解析字符串

    #include <stdio.h>
    #include <stdlib.h>
    
    #ifdef DEBUG
    #define PRINT printf
    #else
    #define PRINT
    #endif
    typedef void (*ACT)(void);
    
    static char buf[64];
    static int j ;
    static char c;
    
    int find_type(char key)
    {
    		if(key >= 'a' && key <= 'z')
    					return 1; // 小写字符
    			if(key >= 'A' && key <= 'Z')
    						return 1; // 大写字符
    				if(key >= '0' && key <= '9')
    							return 2; // 数字
    				if(key == '\0')
    					return 3;  // 结束
    
    					return 0;  //  其他
    
    }
    void act_body(void)
    {
    	buf[j++] = c;
    }
    void act_tail(void)
    {
    	PRINT("word tail found\n");
    	buf[j] = '\0';
    	printf("word is %s \n", buf);	
    
    }
    void act_tail2(void)
    {
    	PRINT("word tail found\n");
    	buf[j] = '\0';
    	printf("number is %s \n", buf);	
    }
    
    void act_head(void)
    {
    	PRINT("word head found!\n");
    	j = 0;
    	buf[j++] = c;
    }
    
    void act_null(void)
    {
    	return;
    }
    void act_end_begin()
    {
    	act_tail();
    	act_head();
    }
    void act_end2_begin()
    {
    	act_tail2();
    	act_head();
    }
    
    ACT acts[3][4] = {
    	act_null, act_head,act_head, act_null,
    	act_tail, act_body, act_end_begin,  act_tail,
    	act_tail2, act_end2_begin, act_body, act_tail2,
    };
    
    int state_trans[3][4] = {
    	0, 1, 2, -1,
    	0, 1, 2, -1,
    	0, 1, 2, -1,
    };
    
    int main(void)
    {
    	int state = 0;
    	int i = 0;
    	char *str = "hello, 123, hello worlda 567";
    
    	printf("%s\n", str);
    
    	while(state != -1)
    	{
    		int input;
    		c = str[i];
    		input = find_type(c);
    		acts[state][input]();
    
    		state = state_trans[state][input];
    	i++;
    	}
    		return 0;
    
    }
    
    
    #if 0
    		switch(state)
    		{
    		case 0://" "
    				switch (input)
    				{
    				case 0:// " "
    					state = 0;
    					act_null();
    					break;
    				case 1:// "a"
    					state = 1;
    					act_head();
    					break;
    				case 2:// "\0"
    					state = -1;
    					act_null();
    					break;
    				}
    			break;
    		case 1://"a"
    				switch(input)
    				{
    				case 0:// " "
    					state = 0;
    					act_tail();
    					break;
    				case 1:// "a"
    					state = 1;
    					act_body();
    					break;
    				case 2:// "\0"
    					state = -1;
    					act_tail();
    					break;
    				}
    			break;
    
    		default :
    			break;
    		}
    		
    		i++;
    	}
    	printf("\n");
    
    	return 0;
    }
    #endif
    

      

  • 相关阅读:
    BeautifulSoup的基本用法
    打印实例
    webservice和一般处理程序
    C# 后台调用存储过程
    表格增加删除
    asp.net C# 获得配置文件AppSettings 的值
    深入浅出zookeeper(一)
    resource下的excel文件下载被损害
    csdn添加目录
    spring面试题,求求你别问我spring了!
  • 原文地址:https://www.cnblogs.com/mathzzz/p/2667815.html
Copyright © 2011-2022 走看看