- //
- // main.m
- // 测试题8
- //
- // Created by 林柯 on 15/4/15.
- // Copyright (c) 2015年 itcast. All rights reserved.
- //
- /*
- 8、 在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。(C语言)
-
- 设计思路: 在字符串中寻找第一个字母,开始计数,直到遇见空格,即一个单词结束,保存该单词长度与开始和结束的位置,
- 继续寻找下一个单词,并该单词的长度大于原来保存的长度,则将该单词的起止位置和长度替换掉原来的.
- 依此循环,直到读入'\0',循环结束;
- 该程序处理一个字符串时,若该字符串中最长单词长度的单词不止一个,只会输出第一个遇到的该长度的单词
- */
- #include <stdio.h>
- #include <stdbool.h>
- int main(void)
- {
- //定义一个字符串用来测试程序
- char str[] = " hello world hello itcast helloWorld";
-
- //定义3个整型变量,存放当前单词在字符串中的起始位置、结束位置,该单词的长度
- int begin = 0,end = 0,length;
-
- //定义3个整型变量,用来存放最长单词的起始位置、结束位置、单词长度
- int maxLength,maxBegin,maxEnd;
-
- //初始化用来保存最长单词的属性,防止字符串中没有字符时程序出错
- maxLength = maxBegin = maxEnd = 0;
-
- //定义一个布尔类型的值,来判断是否到达字符串末尾
- bool isEnd = false;
-
- //开始查找字符串中的单词,直到字符串末尾
- while (!isEnd) {
- //"跳过字符串中位于单词前面的空格,碰到字母或'\0'停止
- while (*(str+begin) == ' ') {
- begin++;
- } //循环结束 begin代表单词的第一个字母或者'\0'在字符串中的位置
-
- //若在单词还未开始就读入'\0',代表字符串结束,没有新的单词需要比较,则直接退出循环
- if(*(str+begin) == '\0')
- break;
-
- //将begin位置的后一个字符的索引赋给end
- end = begin+1;
-
- //统计字符串中单词字母或者'\0',遇到空格结束
- while (*(str+end) != ' ') {
-
- //在单词已经开始计数时遇到'\0',代表该单词结束,且是最后一个单词
- //在比较结束后退出外层循环
- if(*(str+end) == '\0')
- {
- isEnd = true;
- break;
- }
- end++;
- }//循环结束 end代表单词后的第一个空格或者'\0'
-
- //获取当前单词长度
- length = end - begin;
-
- //如果当前单词长度大于之前保存的maxLength,表示该单词时目前查找到的最长单词
- //则用该单词替换之前保存的单词
- if (length > maxLength) {
- maxLength = length;
- maxBegin = begin;
- maxEnd = end;
- }
-
- //将end地址赋值给begin,开始查找下一个单词
- begin = end;
- }
- //整个字符串检索完毕,输出记录的单词,若字符串为空,则不进行任何输出
- for (int i = maxBegin; i < maxEnd; i++) {
- putchar(str[i]);
- }
- return 0;
- }
复制代码 |