A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


自己做一道题,出了点问题,用了好几个小时终于解决了。代码如下,来让准备黑马的同学敲一下,看看能够找到那里出错了。本题本应该输出为最长的英文词是:etioqjwi,其长度是:8个字符。”但按照以下代码结果却是“最长的英文词是:iwj etioqjwi,其长度是:12个字符。”经过我两个小时的努力,终于找到问题的原因了,小伙伴们,你们找到了吗?
  1. /*
  2. 在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。(C语言)
  3. */
  4. #include <stdio.h>
  5. #include <string.h>

  6. int main() {
  7.     int i=0;
  8.     int len = 0;
  9.     int maxlen = 0;
  10.     char *p = NULL;//用来指向最长单词首位
  11.     char *pt;//用来指向当前位置,进行遍历
  12.     char s[] ="saj aksl djiojq qiwj etioqjwi j qwe rqwqr";
  13.     char word[100];
  14.     printf("请输入字符串: \n");
  15.     //基础视频中没有讲到gets函数,只讲了scanf函数,但scanf函数无法接收空格
  16.    // gets(s);
  17.     for(pt = s;*pt != '\0';pt++) {
  18.         if((*pt != ' ')&& (*pt != '\0'))
  19.         {
  20.             len++;
  21.         }
  22.         else {
  23.             if(len > maxlen) {
  24.                 maxlen = len;
  25.                 p = pt - len;
  26.                 len = 0;
  27.             }
  28.         }
  29.     }
  30.     for(i = 0;i < maxlen;i++)
  31.     {
  32.         word[i] = *(p + i);
  33.     }
  34.     word[maxlen] = '\0';
  35.     printf("最长的英文词是:%s,其长度是:%d个字符。\n\n",word,maxlen);
  36.     return 0;
  37. }

复制代码


7 个回复

倒序浏览
没有正确的记录最长字符串的首字母位置,所以当输写最长字符串的时候,输出不正确,而且当遇到空格时,如果没有满足len>maxlen,len就没有被重新初始化,但是len需要被初始化。
回复 使用道具 举报
基础测试题啊,有难度
回复 使用道具 举报
第 27 行的 “len = 0;”向下移一行,移到“}”外面,另外使用scanf("%[^\n]", inputWords);可以接受除换行符以外的任意句子,也就是可以接收完整的一句话。
PS: 楼主需要注意编码规范,代码不太整齐。
回复 使用道具 举报
xcc 发表于 2014-9-24 22:47
第 27 行的 “len = 0;”向下移一行,移到“}”外面,另外使用scanf("%[^\n]", inputWords);可以接受除换行 ...

正解,果然是高手,我是调试了两个多小时,才看出来哪里出问题了。谢谢
回复 使用道具 举报
xcc 发表于 2014-9-24 22:47
第 27 行的 “len = 0;”向下移一行,移到“}”外面,另外使用scanf("%[^\n]", inputWords);可以接受除换行 ...

话说为啥我抽到的基础测试题感觉都那么难呢,难为死我了
回复 使用道具 举报
试试我的代码

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. /*
  4.         功能:查找非空格字符位置
  5.         参数:const char *p                字符指针,从p指向的字符开始往后查找
  6.         返回:char *                        字符指针,表示找到的非空格字符位置
  7. */
  8. char* findNonBlank(const char *p)
  9. {
  10.         while (*p == ' ')
  11.         {
  12.                 p++;
  13.         }
  14.         return (char*)p;
  15. }

  16. /*
  17.         功能:计算一个单词的长度
  18.         参数:const char *p 指向单词首字母的指针
  19.               int *cnt      指向保存当前单词的长度的变量的指针
  20.         返回:char *        单词的末字母的下一个字符位置
  21. */
  22. char* countWord(const char *p , int *cnt)
  23. {
  24.         *cnt = 0;
  25.         while (*p != ' ')
  26.         {
  27.                 if (*p == '\0')
  28.                 {
  29.                         break;
  30.                 }
  31.                 (*cnt)++;
  32.                 p++;
  33.         }
  34.         return (char*)p;
  35. }

  36. /*
  37.         功能:查找并打印一个字符串中的最长单词及其长度
  38.         参数:const char *str                要查找的字符串
  39.         返回:无
  40. */
  41. void findTheWord(const char *str)
  42. {
  43.         char *start , *end , *p , *q;
  44.         int maxSize = 0 , tmpSize = 0;
  45.        
  46.         p = q = start = end = (char*)str;
  47.         while(1)
  48.         {
  49.                 //找到第一个非空格p
  50.                 p = findNonBlank(q);
  51.                 //p是结束符\0
  52.                 if((*p) == '\0')
  53.                 {
  54.                         break;       
  55.                 }
  56.                 start = p;//标记p为单词开头

  57.                 //找到第一个非字母q
  58.                 q = countWord(p , &tmpSize);
  59.                 end = q;//标记q为单词末尾的下一个字符
  60.                 //处理最长单词长度
  61.                 if (tmpSize > maxSize)
  62.                 {
  63.                         maxSize = tmpSize;
  64.                 }
  65.                 //q是结束符\0
  66.                 if((*q) == '\0')
  67.                 {
  68.                         break;
  69.                 }
  70.         }

  71.         if (maxSize)
  72.         {
  73.                 printf("\n最长单词为:");
  74.                 while(start < end)
  75.                 {
  76.                         printf("%c" , *start);
  77.                         start++;
  78.                 }
  79.                 printf("\n其长度为:%d\n" , maxSize);
  80.         }
  81.         else
  82.         {
  83.                 printf("没有最长单词!\n");
  84.         }



  85. }

  86. void main()
  87. {
  88.         char str[1024];
  89.         while(1)
  90.         {
  91.                 printf("输入一个字符串:");
  92.                 gets(str);
  93.                 findTheWord(str);
  94.         }
  95. }
复制代码
回复 使用道具 举报
xcc 初级黑马 2014-9-29 10:16:19
8#
秋水红林 发表于 2014-9-24 23:44
话说为啥我抽到的基础测试题感觉都那么难呢,难为死我了

多练练,熟悉了就不难了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马