C语言 程序运行到一半告诉我出现一个问题导致程序停止工作

程序太长放不上来,略过。我在写词法分析器,done[j]是我存放未处理过的字符的数组。token是目标数组,syn是单词种别码。alpha是我从主程序读过来的字符。我读出... 程序太长放不上来,略过。我在写词法分析器,done[j]是我存放未处理过的字符的数组。token是目标数组,syn是单词种别码。alpha是我从主程序读过来的字符。我读出字符串之后需要比较是否是关键字,这是指针数组:
char *rwtab[27]={"main","if","then","while","do"," static","int",
" double","struct","break","else","long","switch","case",
"typedef","char","return","const","float","short","continue",
"for","void","sizeof","default","do"};
这是子程序
void IsLetter(char alpha)
{
char ch2=alpha;
x=0;
while((ch2>='0' && ch2<='9')||(ch2>='a' && ch2<='z')||(ch2>='A' && ch2<='Z'))
{
token[x]=ch2;
x++;
j++;
ch2=done[j];
}
syn=25;
for(n=0;n<27;n++)
if(strcmp(token,rwtab[n])==0)
{
//我只要在这里面写任意一句话就会告诉我程序出现问题,如果我什么都不写,程序是可以运行的,于是我就蒙了
}
fprintf(fp,"<%d,%s>\n",syn,token);
memset(token,0,sizeof(token));
}

想要完整程序的在这里http://yun.baidu.com/share/link?shareid=4293521057&uk=3271769907
很急!!很急!!求助!!!!!!
谢谢各位大神!!!!!!!!!!!!!!!!!!!!!!
那个……12点以前没有回答的话我就收回了…………
展开
 我来答
zhangsonglin_c
高粉答主

2015-04-15 · 醉心答题,欢迎关注
知道大有可为答主
回答量:3.7万
采纳率:83%
帮助的人:6862万
展开全部

有点儿意思。原因却出乎意料的简单。

char *rwtab[27]={"main","if","then","while","do"," static","int",
" double","struct","break","else","long","switch","case",
"typedef","char","return","const","float","short","continue",
"for","void","sizeof","default","do"};

少了一项,只有26项,rwtab[26]是空指针,访问到它时,就出错了。错误提示如下:

我没有修改这一句的时候,在你指出出错的地方加了下面一句:

for(n=0;n<27;n++)
        if(strcmp(token,rwtab[n])==0)//比较是否关键字
         {
         printf("Cathch a key-word\n");    //
         }

出错了,提示信息如下:

这意味着,访问了一个空指针。

修改如下:

char *rwtab[27]={"main","if","then","while","do","static","int",\
"double","struct","break","else","long","switch","case",\
"typedef","char","return","const","float","short","continue",\
"for","void","sizeof","default","do","long"};//数组少一项,没有27项,另外几个关键词前面有空格,也应该删除。 加了续行符号。
修改之后,运行成功:

我用你的程序做a.txt,生成文件b.txt,c.txt,今天不知什么情况,不能上传。

为什么这样?很玄妙:

rwtab数组少一项,rwtab[26]会引用一个空指针,产生错误。这儿没有语句时,循环没有实质性语句,编译程序优化, 不会编译这个循环的语句,程序中根本没有这几句的内容,因而不会出错。有了语句,就不能省略了,就出错了。

就是这样简单。

另外,你的程序必须当做C++程序编译,否则通不过。C不允许在有实质语句之后定义变量,变量说明要全部放到相应段的最前面,也不支持//注释。我是用DEVC++编译成功的,用WINTC编译失败。

wdghy123
2015-04-15 · TA获得超过1583个赞
知道大有可为答主
回答量:1514
采纳率:95%
帮助的人:721万
展开全部
for(n=0;n<27;n++) \\改成for(n=0;n<26;n++)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
不想的卑微3z
2015-04-14 · TA获得超过584个赞
知道小有建树答主
回答量:1556
采纳率:50%
帮助的人:232万
展开全部
估计你的地址有问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式