#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]!=' ',那么程序还会再次执行内循环,产生错误!