黑马程序员技术交流社区
标题: 在已知的字符串中查找最长单词,假定字符串中只含字母... [打印本页]
作者: 该有个目标了 时间: 2014-8-19 11:35
标题: 在已知的字符串中查找最长单词,假定字符串中只含字母...
#include<stdio.h>
int main()
{
//定义一个已知的字符串
char a[] = "we need you and forever love you";
//定义一个指针指向a的首元素
char *p = a;
//定义一个指针来存放最长单词的首字母地址
char *save;
//定义单词的长度,与最长单词的长度
int length = 0, lengthMax = 0;
//循环遍历数组
for(int i = 0; a != '\0'; i++)
{
//如果不为空格就使p指向的地址+1
if(*p != ' ')
{
p++;
length++;
}
//如果为空格
else if(*p == ' ')
{
p++;
//找出最长单词
if(length > lengthMax)
{
lengthMax = length;
save = p - length - 1; //这句是什么意思,没看懂??????
}
length = 0;//这句是什么意思,没看懂??????
}
}
//输出最长单词
printf("最长单词为:\n ");
//从保存的最长单词输出
for(int i = 0; i < lengthMax; i++)
{
printf("%c",*(save + i));//这句(save +i)是什么意思,没看懂??????
}
return 0;
}
作者: ★Joean_Zhou 时间: 2014-8-19 23:01
不知道我说明白没,希望可以帮到楼主。。。
- #include<stdio.h>
- int main()
- {
- //定义一个已知的字符串
- char a[] = "we need you and forever love you";
-
- //定义一个指针指向a的首元素
- char *p = a;
-
- //定义一个指针来存放最长单词的首字母地址
- char *save;
-
- //定义单词的长度,与最长单词的长度
- int length = 0, lengthMax = 0;
-
- //循环遍历数组
- //for(int i = 0; a != '\0'; i++) //**********这里应该是a[i]
- for(int i = 0; a[i] != '\0'; i++)
- {
- //如果不为空格就使p指向的地址+1
- if(*p != ' ')
- {
- p++;
-
- length++;
- }
-
- //如果为空格
- else if(*p == ' ')
- {
- p++;
- //找出最长单词
- if(length > lengthMax)
- {
- lengthMax = length;
-
- save = p - length - 1; //这句是什么意思,没看懂??????
- //*******************/意思是把最长单词的首字母的地址给保存起来,就是p现在指向的是最长单词的末尾,-length -1 就是把p现在的位置减去最长单词的长度,就指向最长单词的首字母了,-1是要多减一个,好比数组一样是从0开始的而不是从1开始的
- }
-
- length = 0;//这句是什么意思,没看懂??????
- //**********/意思是把当前单词的长度清空,重新计算下一个单词的长度与当前<最长>的单词进行比较
- }
- }
- //输出最长单词
- printf("最长单词为:\n ");
-
- //从保存的最长单词输出
- for(int i = 0; i < lengthMax; i++)
- {
- printf("%c",*(save + i));//这句(save +i)是什么意思,没看懂??????
-
- //**************/意思是一个一个的取出最长单词的字母,因为save指向的是最长单词的首字母,所以要想完全输出,就要把地址一个一个往后移
- }
-
-
- return 0;
- }
复制代码
作者: 小月格子猫 时间: 2014-8-19 23:03
本帖最后由 小月格子猫 于 2014-8-20 01:55 编辑
#include <stdio.h>
#include <string.h>
/**解题思路
* 1.》 定义一串字符,然后遍历
* 2.》定义一个变量保存,最长的长度
* 3.》定义一个指针保存,最长单词的结尾地址
*/ // 4.》获得这两个值之后,结尾地址的加一的地址减去字符长度得到,最长单词的的首地址,然后就好
// 输出了
int main()
{
char array[] = "dgvcbncvvcvcbvn's hjghhjkgjhggjjh jhbkhjgh";
//定义一个字符串
long arrayLen =strlen(array);
//计算出这个字符串的长度,以便于遍历字符串
char *array1 = array;
//定义一个指针,指向字符串的首地址
int arraylen = 0;
//定义一个临时长度,以便于比较新保存的单词长度于已经保存的最长度哪个长
int Maxlen = 0 ;
//定义一个变量,保存最长长度
char *saveArray = array1;
//定义一个指针,保存最长单词的结尾地址
for (int i = 0; i< arrayLen; i++)
//遍历开始
{
if (*array1 != ' ')
//if 语句判断 遍历的字符是否为空格,不为空格将执行语句
{
arraylen++;
//临时长度加1
if (i == arrayLen-1 && arraylen > Maxlen )
//关于这个是我后来加上的,我不知道你发上来的代码是不是有bug,这个判断语句你可以最后看
//因为还有种可能性,就是最后面的单词长怎么办,那个地方可能空格让你判断
//所以我在这个地方加了一个判断语句
{
Maxlen = arraylen;
array1++;
saveArray = array1;
continue;
}
array1++;
//遍历的地址加1,以便于遍历下一个字符
}
//当它遍历很多次的时候,终于遍历到了空格,这个时候临时
//单词长度已经保存了第一个单词长度
else if (*array1 == ' ')
{
if(arraylen > Maxlen)
//进入语句之后,我们先判断这个条件
//最长的长度是否有临时长度长,在这里很显然没有,因为
//前面我是将它初始化为0的,然后进入下面语句
{
Maxlen = arraylen;
//于是我将这个临时的单词长度,赋予最长长度
//并将临时长度赋予0,以便于记录下个单词长度
arraylen = 0;
saveArray = array1;
//然后保存这个单词的结尾地址
array1++;
//同样的地址也要加哟,不然就没法顺利遍历下一个字符
continue;
//这些做完之后,就可以结束这次循环,进入下一次
}
arraylen = 0;
//如果程序来到这里,证明所保存的最长长度比临时长度大
//那么就没必要保存了,我们要将最长单词的长度赋予0
//以便下次记录临时长度
array1++;
//同样的地址加1
}
}
for (int i = 0; i<Maxlen; i++)
//然后单词已经遍历结束,已经保存了单词最长长度的结尾地址和
//单词的长度
{
printf("%c",*(saveArray-Maxlen+i));
} //然用结尾+1的地址-减去最长长度则为首地址,相当于第二十一个地址减去二十个地址就是第一个
printf("\n"); //然后第二位地址则是第一个地址加1
}
要是看不懂可以在问
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |