首先这个代码的作者概念貌似比较混乱。我大概发现了下面几个问题,见注释:
#include<stdio.h> // inst 1
#include<string.h>
#include<ctype.h>
char *dic[][40]= // inst 2
{
"atlas",
"A volume of maps.",
"car",
"A motorized vehicle.",
"telephone",
"A commmunication device.",
"airplane",
"A flying machine.",
" ", // inst 3
" "
};
int main(void)
{
char word[80],ch;
char **p;
do
{
puts("\nEnter word:");
scanf("%s",word);
p=(char **)dic; /*<-此为第一处看不懂的地方,这个语句到底什么意思,有什么用?*/ // inst 4
do{
if(!strcmp(*p,word))
{
puts("Meaning:");
puts(*(p+1));
break;
}
if(!strcmp(*p,word))
break;
p=p+2;
}while(*p); // inst 5
if(!*p) // inst 6
puts("Word not in dictionary.");
printf("Another?(y/n):");
scanf("%c%*c",&ch); /*<-此为第二处看不懂的地方,同样是看不懂这个语句的用意。*/ // inst 7
}while(toupper(ch)!='N'); /*<-第三处,为什么无论输入y,还是n,都不跳出循环,仍然从头开始执行*/ // inst 8
return 0;
}
1、排版太乱,我用了50秒时间来修改排版,虽然还不够理想,至少可以看清了。
2、这个是一个指针数组,我想作者大概是想定义若干个字符指针,每个指针指向的字符串长度不超过40。
可是char *dic[][40]这种定义的是N * 40 个指针,每个指针指向一个字符串。
3、这里的空格也比较有迷惑性,作者大概是想作为循环结束的结束符,可是空格' '和结束符'\0'是不一样的
4、楼主的疑问1:这里其实就是每循环一次都把头指针指向字符串表的表头方便下次搜索,可是由于inst 2里说的问题,这里很有问题
5、作者想用while(*p)来判断是否到达了字符串表的末尾,可是这样做是不行的。你可以试试把*p的值打印出来就知道为什么了。
6、同样,这里判断是否找到了匹配字符串也是不正确的。
7、这个地方可以说构思还算巧妙,想跳过上次留下的回车符,再获取输入的字符,可是很遗憾,格式字符写反了。这也就是LZ所说的怎么
跳都跳不出去的原因。
8、LZ的疑问3:7已经说了不能跳出的原因,这个地方只是把小写n转换为大写再判断,这样无论大小写的n都可以跳出了。
附上修改后的代码,没有改算法,只是让程序基本功能可用,不保证健壮性。
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char *dic[]={
"atlas",
"A volume of maps.",
"car",
"A motorized vehicle.",
"telephone",
"A commmunication device.",
"airplane",
"A flying machine.",
"\0",
"\0"
};
int main(void)
{
char word[80],ch;
char **p;
do
{
puts("\nEnter word:");
scanf("%s",word);
p = dic;
do
{
if(!strcmp(*p,word))
{
puts("Meaning:");
puts(*(p+1));
break;
}
if(!strcmp(*p,word))
break;
p=p+2;
}while(**p);
if(!**p)
puts("Word not in dictionary.");
printf("Another?(y/n):");
scanf("%*c%c",&ch);
}while(toupper(ch)!='N');
return 0;
}