鱼C论坛

 找回密码
 立即注册
查看: 1481|回复: 3

[技术交流] 程序有问题,大神看看

[复制链接]
发表于 2015-4-1 13:03:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这个程序没有实际意义,目的在于删除程序中自带的一些注释和宏定义,但是编译会报错,请看看哪里不对。
#include <stdio.h>
#include <string.h>
#include <ctype.h>                

#define debug(fmt,args,...)                fprintf(stderr,fmt,##args)

int get_input_type(char * word)
{
        if(strcmp(word," ") == 0)
                return 0;
                
        if(strcmp(word,"\t") == 0)
                return 0;
                
        if(strcmp(word,"#") == 0)
                return 1;
                
        if(strcmp(word,"define") == 0)
                return 2;
                
        if(strcmp(word,"\n") == 0)
                return 4;

        return 3;
}

char c;
char word[64];
char word_buf[64];
char buf[128];

struct macro
{
        char name[64];
        char value[64];
} macros[16];

int macro_counter = 0;

void act_print_word(void)
{
        int i = 0;
        for(i=0;i<macro_counter;i++)
        {
                if(strcmp(word,macros[i].name) == 0)
                {
                        printf("%s",macros[i].value);
                        return;
                }
                        
                break;
        }
        
        if(i == macro_counter)
                printf("%s",word);
        
        return;
}

void act_save_to_buf(void)
{
        strcat(buf,word);
        
        return;
}

void act_print_buf_and_word(void)
{
        printf("%s",buf);
        printf("%s",word);
        
        return;
}

void act_save_word(void)
{
        strcat(word_buf,word);
        
        return;
}


void act_get_macro_name(void)
{
        printf("name = <%s>\n",word_buf);
        
        strcpy(macros[macro_counter].name,word_buf);
        strcpy(word_buf,"");

        return;
}

void act_get_macro_value(void)
{
        printf("value = <%s>\n",word_buf);                        
        
        strcpy(macros[macro_counter].value,word_buf);
        strcpy(word_buf,"");
        
        macro_counter++;
        
        return;
}

void act_null(void)
{
        return;
}

enum {s0 = 0,s1,s2,s3,s4,s5,s6};
int state_transition[7][5] = 
                {
                        s0,                s1,                s0,                s0,                s0,

                        s1,                s0,                s2,                s0,                s0,
                        
                        s3,                s0,                s0,                s0,                s0,
                        
                        s3,                s4,                s4,                s4,                s0,
                        
                        s5,                s5,                s4,                s4,                s0,
                
                        s5,                s6,                s6,                s6,                s0,
                        
                        s6,                s6,                s6,                s6,                s0,
                };

#define a0 act_print_word
#define a1 act_save_to_buf
#define a2 act_print_buf_and_word
#define a3 act_save_word
#define a4 act_get_macro_name
#define a5 act_get_macro_value
#define a6 act_null

#if 1        
typedef void (*PF)(void);
PF act_table[7][5] = 
{
        a0,                a1,                a0,                a0,                a0,
        a1,                a2,                a1,                a2,                a2,
        a1,                a2,                a2,                a2,                a2,
        a1,                a3,                a3,                a3,                a2,
        a4,                a4,                a3,                a3,                a5,
        a6,                a3,                a3,                a3,                a5,                
        a3,                a3,                a3,                a3,                a5,
};
#endif

void getword(char * word)
{
        char c;
        
        c = getchar();
        
        if(c == EOF)
        {
                *word = '\0';
                return;
        }
        
        // if c is not a alpha
        if(isalpha(c) == 0) // or  if(!isalpha(c))
        {
                *word = c;
                word ++;
                *word = '\0';
                return;
        }
        
        do
        {
                *word++ = c;
                c = getchar();
        }while(isalnum(c) || c == '_');
        
        // current c is $ or anything else
        ungetc(c,stdin);
        *word = '\0';
        
        return;
}
        
int main(void)
{        
        int state = 0;
        
        while(1)
        {
                
                int input = 0;
                void (*pf)(void);
                //char word[64];
                
                //c = getchar();
                //input = get_input_type(c);
                getword(word);
                input = get_input_type(word);
                
                //printf("c = %c,input = %d\n",c,input);  it's debug sentence.
                
                //if(c == EOF)    
                //        break;
                if(strcmp(word,"") == 0)
                        break;
                
                pf = act_table[state][input];
                pf();
                
                state = state_transition[state][input];
                
                debug("word = <%s>,input = %d,state = %d\n",word,input,state);
        }

        return 0;
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-4-5 20:29:49 | 显示全部楼层
五天了,没人懂?还是没人理。这人缘~~~~~:cry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-4-5 20:46:34 | 显示全部楼层
本帖最后由 haiouda 于 2015-4-5 20:50 编辑

我是菜鸟,看着有点乱;
哥们,给你提点意见(可能是我水平实在太差):
哥们,要不你就把你这程序是怎么实现的,说一说(思路);
再不,你就多加些注释,这样一来,也好读懂;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-6 06:53:08 | 显示全部楼层
本帖最后由 xxzj01 于 2015-4-6 11:17 编辑
haiouda 发表于 2015-4-5 20:46
我是菜鸟,看着有点乱;
哥们,给你提点意见(可能是我水平实在太差):
哥们,要不你就把你这程序是怎么 ...

这个程序没有实际意义,目的在于删除程序中自带的一些注释和宏定义.程序来自李明新概念C语言(git-hub).报错如下:pasting "," and "word" does not give a valid preprocessing token
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 21:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表