应用示例
示例字符串:const char* str="student work homework library"
函数:Get_MaxWord(str)
输出结果:homework
算法分析
就题目整体而言,我们需要挑选出字符串其中一个个单词,将其字符长度进行比较,得出最长字符串并予以返回。整体算法十分的简单,但我们要如何用C语言的代码用以实现呢?
面对此题,我们首先应该明白我们是从整体字符串中选取局部字符串,为此我们需要一个缓冲字符数组来接收我们从中获取的一个单词。
与此同时,我们还需考虑到:我们需要用当前字符串来与最大字符串来进行比较,判断是否该单词能否代替最大单词,这时候我们就还需要一个字符数组来存储已遍历单词中的最大单词来用以比较。
于是,我们写出了如下代码:
char CurWord[100]; //用以存储当前单词
char MaxWord[100]; //用以存储已遍历单词中的最大单词
为了帮助我们比较当前单词与最大单词究竟谁大,我们在函数的最前面就需要定义:
int len_cur = 0; //保存临时单词空间内的长度
int len_max = 0; //保存最大单词空间内的长度
好的,我们用于存储单词的容器都有了,那么接下来就是我们该如何选取单词的问题。
单词与单词之间用什么判断一个单词结束了呢?一个单词与另一个单词往往用特殊字符隔开,那么这就意味着,我们仅需每次在将字符添入CurWord[100]时,判断是否还是字母就可以了,下边代码中使用了<ctype.h>的库函数isalpha()用来判断一个字符是否是字母。str为传入函数的数组首地址。
if (isalpha(*str)) //如果为真 代表指针str指向的字符是一个字母字符
{
CurWord[len_cur++] = *str;
}
在这里,如果当前str指向的字符为字母,我们将该字符读入CurWord字符数组中,并且当前单词的长度len_cur自加一。
为了使str跑起来来遍历整个字符串,我们显然需要一个循环来使str不断往字符串的后面跑。
while (*str != '\0')
{
if (isalpha(*str))//如果为真 代表指针str指向的字符是一个字母字符
{
CurWord[len_cur++] = *str;
}
str++;
}
直到str跑到字符串的末尾'\0',我们就可以结束循环来返回结果了,但这里我们仍然缺少判断是否为最大单词并且将其读入字符数组MaxWord之中,这要在什么情况下进行这一步呢?
显然,我们需要在一个单词结束之时来进行这一步,也正是我们的isalpha()返回值为false的情况!
while (*str != '\0')
{
if (isalpha(*str))//如果为真 代表指针str指向的字符是一个字母字符
{
CurWord[len_cur++] = *str;
}
else
{
if (len_cur > len_max)
{
strcpy(MaxWord, CurWord);
len_max = len_cur;
}
len_cur = 0;
}
str++;
}
我们在一个单词完毕之后需要将当前单词的长度赋为0,随后才能开始挑取下一个单词。
如果我们在这个地方就进行返回Maxword,有同学将我们之前的示例放进去,返回了homework的结果,对了,很开心,对不对?然而,其实在这里是存在bug的,细心的同学可以尝试查找。
接下来是全过程:
while (*str != '\0')
{
if (isalpha(*str))//如果为真 代表指针str指向的字符是一个字母字符
{
CurWord[len_cur++] = *str;
}
else
{
if (len_cur > len_max)
{
strcpy(MaxWord, CurWord);
len_max = len_cur;
}
len_cur = 0;
}
str++;
}
if (len_cur > len_max)
{
strcpy(MaxWord, CurWord);
}
到检测到'\0'循环退出的时候,我们其实是没有进行最后一轮当前与最大单词之间的比较的,这就意味着如果单词最后一个是最大单词的话,返回的最大单词并不是最大单词的bug,大家不妨回头再看看。
全部代码
#include<ctype.h>
#include<string.h>
//获取最大单词
char CurWord[100];
char MaxWord[100];
char *Get_MaxWord(const char *str)
{
int len_cur = 0;//保存临时单词空间内的长度
int len_max = 0;//保存最大单词空间内的长度
while (*str != '\0')
{
if (isalpha(*str))//如果为真 代表指针str指向的字符是一个字母字符
{
CurWord[len_cur++] = *str;
}
else
{
if (len_cur > len_max)
{
strcpy(MaxWord, CurWord);
len_max = len_cur;
//len_cur = 0;
}
len_cur = 0;
}
str++;
}
if (len_cur > len_max)
{
strcpy(MaxWord, CurWord);
}
return MaxWord;
}