#include<stdio.h>
#include<string.h>
void fun1(char *a);
int main(void)
{
char str[100];
puts("请输入一段长字符串,本程序将找出其中最长的子串");
while(gets(str)!=NULL && str[0] != '\0')
{
fun1(str);
puts("\n再输入一个字符串(空行退出):");
}
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]!='\0';i++) //错误!!!
for(i = 0;i<strlen(p);i++) //空格也计入i了
{
len_word=0; //单词长度每次清零
while(p[i]!=' ' && p[i]!='\0')
{
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]!='\0') 为什么要两个限制条件呢?
答:p[i]!=‘ ’这个条件很显然,因为是以空格区分两个子串
p[i]!='\0'这个条件是因为,最后一个子串不是以空格结尾的,而是结束符。
②外循环for(i = 0;i<strlen(p);i++) ,为什么这里不写for(i = 0;str[i]!='\0';i++)呢?
答:内循环判断最后一个子串的时候,i一直要自加到i=len,即p[len]='\0' 的时候,才退出内循环。
然后进入外循环,此时要先执行i++,再执行判断条件。也就是说,str[i]此时的值是str[len+1],而这个值我们无法确定,它可能是内存中的任何值。
如果这里的判断条件是str[i]!='\0',那么程序还会再次执行内循环,产生错误!