找出字符串中最长的子串

#include<stdio.h>
#include<string.h>
void fun1(char *a);
int main(void)
{
	char str[100];
	puts("请输入一段长字符串,本程序将找出其中最长的子串");
	while(gets(str)!=NULL && str[0] != '')
	{
		fun1(str);
		puts("
再输入一个字符串(空行退出):");
	}
	puts("Bye!@~");

	return 0;
}
void fun1(char *p)
{
	unsigned int i;
	unsigned int len_word;
	unsigned int len_max=0;
	unsigned int place=0; //记录指针位置
	//for(i = 0;p[i]!='';i++)  //错误!!!
	for(i = 0;i<strlen(p);i++)   //空格也计入i了
	{
		len_word=0;  //单词长度每次清零
		while(p[i]!=' ' && p[i]!='')  
		{
			i++;
			len_word++;
		}
		if(len_max<len_word)
		{
			len_max=len_word;
			place = i-len_word;
		}
	}
	puts("最长的子串为:");
	for(i=place;i<place+len_max;i++)  //注意这里的范围
		printf("%c",p[i]);
}

 

程序思想:

记录每个单词的长度,与max_len比较,比它长,则将值赋给max_len。

i记录读入的字符个数(包含空格),i-max_len得到的就是这个最长单词的首字母的位置。


此程序有几点值得注意的:

①内循环while(p[i]!=' ' && p[i]!='')   为什么要两个限制条件呢?

答:p[i]!=‘ ’这个条件很显然,因为是以空格区分两个子串

p[i]!=''这个条件是因为,最后一个子串不是以空格结尾的,而是结束符。


②外循环for(i = 0;i<strlen(p);i++) ,为什么这里不写for(i = 0;str[i]!='';i++)呢?

答:内循环判断最后一个子串的时候,i一直要自加到i=len,即p[len]='' 的时候,才退出内循环。

然后进入外循环,此时要先执行i++,再执行判断条件。也就是说,str[i]此时的值是str[len+1],而这个值我们无法确定,它可能是内存中的任何值。

如果这里的判断条件是str[i]!='',那么程序还会再次执行内循环,产生错误!


原文地址:https://www.cnblogs.com/james1207/p/3281221.html