首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

编译程序,高人指教,该怎么解决

2012-02-20 
编译程序,高人指教程序输入/输出示例:如源程序为C语言。输入如下一段:main(){inta,ba10ba+20}要求输出

编译程序,高人指教
程序输入/输出示例:
如源程序为C语言。输入如下一段:
main()                                                                                                                                                  
{
int     a,b;
a   =   10;
    b   =   a   +   20;
}
要求输出
(2,”main”)(5,”(“)(5,”)“)(5,”{“)(1,”int”)(2,”a”)(5,”,”)(2,”b”)(5,”;”)(2,”a”)(4,”=”)(3,”10”)(5,”;”)(2,”b”)(4,”=”)(2,”a”)(4,”+”)(3,”20”)(5,”;”)(5,”}“)

程序如下:
#include   <stdio.h>
#include   <ctype.h>
#include   <malloc.h>
#include   <stdlib.h>
#include   <string.h>
#define   NULL   0

FILE   *fp;
char   cbuffer;
char   *key[8]={ "if ", "else ", "for ", "while ", "do ", "return ", "break ", "continue "};
char   *border[6]={ ", ", "; ", "{ ", "} ", "( ", ") "};
char   *arithmetic[4]={ "+ ", "- ", "* ", "/ "};
char   *relation[6]={ " < ", " <= ", "= ", " ", "= ", " < "};
char   *consts[20];
char   *label[20];
int   constnum=0,labelnum=0;

int   search(char   searchchar[],int   wordtype)
{
          int   i=0;
          switch   (wordtype)   {
              case   1:for   (i=0;i <=7;i++)
    {
      if   (strcmp(key[i],searchchar)==0)
          return(i+1);
    }
              case   2:{for   (i=0;i <=5;i++)
    {
      if   (strcmp(border[i],searchchar)==0)
            return(i+1);
    }               return(0);
            }

              case   3:{for   (i=0;i <=3;i++)
    {
      if   (strcmp(arithmetic[i],searchchar)==0)
            {
              return(i+1);
            }
    }
            return(0);
            }

              case   4:{for   (i=0;i <=5;i++)
    {
      if   (strcmp(relation[i],searchchar)==0)
            {
              return(i+1);
            }
    }
              return(0);
            }

              case   5:{for   (i=0;i <=constnum;i++)


    {
      if   (strcmp(consts[i],searchchar)==0)
              {
return(i+1);
              }
    }
            consts[i-1]=(char   *)malloc(sizeof(searchchar));
            strcpy(consts[i-1],searchchar);
            constnum++;
            return(i);
            }

              case   6:{for   (i=0;i <=labelnum;i++)
    {
          if   (strcmp(label[i],searchchar)==0)
              {
return(i+1);
              }
    }
            label[i-1]=(char   *)malloc(sizeof(searchchar));
            strcpy(label[i-1],searchchar);
            labelnum++;
            return(i);
            }

            }


}


char   alphaprocess(char   buffer)
{
            int   atype;
            int   i=-1;
            char   alphatp[20];
            while   ((isalpha(buffer))||(isdigit(buffer)))
        {
        alphatp[++i]=buffer;
        buffer=fgetc(fp);
        }
            alphatp[i+1]= '\0 ';
            if   (atype=search(alphatp,1))
  printf( "%s   (1,%d)\n ",alphatp,atype-1);
            else
  {
  atype=search(alphatp,6);
  printf( "%s   (6,%d)\n ",alphatp,atype-1);
  }
            return(buffer);
}

char   digitprocess(char   buffer)
{
            int   i=-1;
            char   digittp[20];
            int   dtype;
            while   ((isdigit(buffer)))
        {
        digittp[++i]=buffer;
        buffer=fgetc(fp);
        }
            digittp[i+1]= '\0 ';
            dtype=search(digittp,5);
            printf( "%s   (5,%d)\n ",digittp,dtype-1);
            return(buffer);
}

char   otherprocess(char   buffer)
{

            int   i=-1;
            char   othertp[20];
            int   otype,otypetp;
            othertp[0]=buffer;
            othertp[1]= '\0 ';


            if   (otype=search(othertp,3))
  {
  printf( "%s   (3,%d)\n ",othertp,otype-1);
  buffer=fgetc(fp);
  goto   out;
  }

            if   (otype=search(othertp,4))
            {
            buffer=fgetc(fp);
            othertp[1]=buffer;
            othertp[2]= '\0 ';
            if   (otypetp=search(othertp,4))
  {
  printf( "%s   (4,%d)\n ",othertp,otypetp-1);
  goto   out;
  }
            else
  othertp[1]= '\0 ';
  printf( "%s   (4,%d)\n ",othertp,otype-1);
  goto   out;
            }

            if   (buffer== ': ')
            {
            buffer=fgetc(fp);
            if   (buffer== '= ')
  printf( ":=   (2,2)\n ");
  buffer=fgetc(fp);
  goto   out;
            }
      else
            {
            if   (otype=search(othertp,2))
  {
  printf( "%s   (2,%d)\n ",othertp,otype-1);
  buffer=fgetc(fp);
  goto   out;
  }
            }

    if   ((buffer!= '\n ')&&(buffer!= '   '))
    printf( "%c   error,not   a   word\n ",buffer);
    buffer=fgetc(fp);
out:             return(buffer);
}


void   main()
{
          int   i;
            for   (i=0;i <=20;i++)
    {
      label[i]=NULL;
      consts[i]=NULL;
    };
            if   ((fp=fopen( "example.c ", "r "))==NULL)
  printf( "error ");
            else
{
cbuffer   =   fgetc(fp);
while   (cbuffer!=EOF)
  {
    if   (isalpha(cbuffer))
          cbuffer=alphaprocess(cbuffer);
    else   if   (isdigit(cbuffer))
          cbuffer=digitprocess(cbuffer);
    else   cbuffer=otherprocess(cbuffer);
    }
  printf( "over\n ");
  getchar();
  }
}

运行后老显示error,很困惑,请指教!



[解决办法]
显示error是因为你没有把example.c文件放对位置, 如果你不知道放在哪儿,
可以在fopen()函数里指定一个绝对路径

这个错误跳过后, 在Search函数里有很大问题.

特别是case 5 case 6两个分支, 会有越界或是空指针引用问题, 建议仔细单步调试.

热点排行