标题:菜鸟求助。一个程序,有些读不懂的地方,忘大虾们指点下!
只看楼主
fifa_king
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2008-7-21
 问题点数:0 回复次数:3 
菜鸟求助。一个程序,有些读不懂的地方,忘大虾们指点下!
源程序如下:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
char *dic[][40]={  
  "atlas","A volume of maps.",
  "car","A motorized vehicle.",
  "telephone","A commmunication device.",
  "airplane","A flying machine.",
  " "," "
};

int main(void)
{
  char word[80],ch;
  char **p;
  do{
    puts("\nEnter word:");
    scanf("%s",word);
    p=(char **)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'); /*<-第三处,为什么无论输入y,还是n,都不跳出循环,仍然从头开始执行*/
  return 0;
}
大虾们帮忙看看,帮忙解释下前2处的语句,看看第三处有什么问题,让do循环是个死循环。谢谢了
搜索更多相关主题的帖子: telephone include machine volume 源程序 
2008-08-07 16:45
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
得分:0 
首先这个代码的作者概念貌似比较混乱。我大概发现了下面几个问题,见注释:
#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;
}

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-08-07 21:13
fifa_king
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2008-7-21
得分:0 
十分感谢楼上兄弟的帮忙,受教非浅,十分感谢!

科学家会武术,谁也挡不住!
                      ——郭德纲
2008-08-08 09:03
f1yant
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-8-10
得分:0 
1.定义语句嘛~
2.输入一个值嘛~
3.貌似循环比较难把~
2008-08-10 10:40



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-227213-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042512 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved