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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. //
  2. //  main.m
  3. //  测试题8
  4. //
  5. //  Created by 林柯 on 15/4/15.
  6. //  Copyright (c) 2015年 itcast. All rights reserved.
  7. //

  8. /*
  9. 8、 在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。(C语言)

  10. 设计思路: 在字符串中寻找第一个字母,开始计数,直到遇见空格,即一个单词结束,保存该单词长度与开始和结束的位置,
  11.           继续寻找下一个单词,并该单词的长度大于原来保存的长度,则将该单词的起止位置和长度替换掉原来的.
  12.           依此循环,直到读入'\0',循环结束;
  13.           该程序处理一个字符串时,若该字符串中最长单词长度的单词不止一个,只会输出第一个遇到的该长度的单词
  14. */

  15. #include <stdio.h>
  16. #include <stdbool.h>
  17. int main(void)
  18. {
  19.     //定义一个字符串用来测试程序
  20.     char str[] = "   hello world hello  itcast helloWorld";
  21.    
  22.     //定义3个整型变量,存放当前单词在字符串中的起始位置、结束位置,该单词的长度
  23.     int begin = 0,end = 0,length;
  24.    
  25.     //定义3个整型变量,用来存放最长单词的起始位置、结束位置、单词长度
  26.     int maxLength,maxBegin,maxEnd;
  27.    
  28.     //初始化用来保存最长单词的属性,防止字符串中没有字符时程序出错
  29.     maxLength = maxBegin = maxEnd = 0;
  30.    
  31.     //定义一个布尔类型的值,来判断是否到达字符串末尾
  32.     bool isEnd = false;
  33.    
  34.     //开始查找字符串中的单词,直到字符串末尾
  35.     while (!isEnd) {
  36.         //"跳过字符串中位于单词前面的空格,碰到字母或'\0'停止
  37.         while (*(str+begin) == ' ') {
  38.             begin++;
  39.         }  //循环结束 begin代表单词的第一个字母或者'\0'在字符串中的位置
  40.         
  41.         //若在单词还未开始就读入'\0',代表字符串结束,没有新的单词需要比较,则直接退出循环
  42.         if(*(str+begin) == '\0')
  43.             break;
  44.         
  45.         //将begin位置的后一个字符的索引赋给end
  46.         end = begin+1;
  47.         
  48.         //统计字符串中单词字母或者'\0',遇到空格结束
  49.         while (*(str+end) != ' ') {
  50.             
  51.             //在单词已经开始计数时遇到'\0',代表该单词结束,且是最后一个单词
  52.             //在比较结束后退出外层循环
  53.             if(*(str+end) == '\0')
  54.             {
  55.                 isEnd = true;
  56.                 break;
  57.             }
  58.             end++;
  59.         }//循环结束 end代表单词后的第一个空格或者'\0'
  60.         
  61.         //获取当前单词长度
  62.         length = end - begin;
  63.         
  64.         //如果当前单词长度大于之前保存的maxLength,表示该单词时目前查找到的最长单词
  65.         //则用该单词替换之前保存的单词
  66.         if (length > maxLength) {
  67.             maxLength = length;
  68.             maxBegin = begin;
  69.             maxEnd = end;
  70.         }
  71.         
  72.         //将end地址赋值给begin,开始查找下一个单词
  73.         begin = end;
  74. }
  75.     //整个字符串检索完毕,输出记录的单词,若字符串为空,则不进行任何输出
  76.     for (int i = maxBegin; i < maxEnd; i++) {
  77.         putchar(str[i]);
  78.     }
  79.     return 0;
  80. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
Micro + 2 赞一个!

查看全部评分

1 个回复

正序浏览
代码有点略长,希望有兴趣的朋友可以耐心看看
给我一些建议,大家共同进步
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马