读书人

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

发布时间: 2012-02-20 21:18:24 作者: rapoo

编译程序,高人指教
程序输入/输出示例:
如源程序为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两个分支, 会有越界或是空指针引用问题, 建议仔细单步调试.

读书人网 >软件架构设计

热点推荐