在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。
找空格那里有问题
代码如下:
/*
1、定义有参无返回值的函数
2、计算字符串长度
3、计算空格数量
4、定义1个数组arr[a],元素分别赋值空格在字符串中的位置(第几个字符)
5、再定义1个数组arr1[a-1],元素分别赋值是上面数组对应元素值的差,差越大,两个空格离的就越远,单词自然就越长
6、找最长单词
1)、字符串第一个字符、最后一个字符都是空格
找数组arr1[a-1]中的最大数arr[max],第max+1个空格后面的单词即是最长的单词
2)、还有另外三种情况,字符串第一个字符不是空格,或者最后一个字符不是空格,所以还需要让第max+1个空格后面的单词和第一个单词、最后一个单词比较
7、主函数,定义指针变量,并赋值字符串,掉入定义的函数,即可
*/
//因为有打印输出函数,所以需要预处理拷贝stdio.h文件到这里
#include<stdio.h>
//定义有参无返回值的函数,形参为char类型的指针变量
voidchaCha(char *p){
//定义整型变量a,len,并初始化赋值0
int a=0;
intlen=0;
//定义字符型变量key,并初始化赋值' ',key即表示字符串中的空格字符
char key=' ';
//循环遍历,直到*(p+len)=='\0'时为止,遍历时len++,所得len即为字符串的长度
for (inti=0; *(p+len)!='\0'; i++) {
len++;
}
//循环遍历,直到*(p+len)=='\0'时为止,遍历中,如果*(p+i)是空格,a增加1个(a++),最后所得a即为空格数量
for (inti=0; i<len; i++) {
if (*(p+i)==key) {
a++;
}
}
//定义整型数组arr[a]
intarr[a];
//循环遍历字符串指针指向的字符*(p+j)是否等于空格,等于就让数组arr[a]的元素依次等于字符的下标j
//循环遍历以上步骤,可使数组元素值依次等于字符串中空格的下标
???这里总是找出最后一个空格,前面的空格找不到是怎么回事?
for (inti=0; i<a; i++) {
for (int j=0; j<len; j++) {
if (*(p+j)==key) {
arr[i]=j;
}
}
}
//定义整型数组arr1[a-1]
int arr1[a-1];
//循环遍历整型数组arr1[a-1],使数组arr1的元素值等于数组arr相应元素(字符串中空格的下标)之差,arr1[i]=arr[i+1]-arr[i]
for (inti=0; i<a-1; i++) {
arr1[i]=arr[i+1]-arr[i];
}
//找数组arr1[a-1]中的最大数,并记录下标,也就是数组arr相应元素之差最大,也就是字符串中空格的下标之差最大,即两个空格之间的单词最长
int max=0;
for (inti=0; i<a-1; i++) {
if (arr1[max]<arr1[i]) {
max=i;
}
}
//arr1[max]就是数组arr1[a-1]中的最大数,又因为arr1[i]=arr[i+1]-arr[i]
//所以字符串中,空格之间的单词中,第max个空格和第max+1个空格中间的单词最长
/*四种情况
1、字符串最前面的字符不是空格,字符串最后一个字符是空格;
2、字符串最前面的字符是空格,字符串最后一个字符不是空格;
3、字符串最前面的字符是空格,字符串最后一个字符是空格;
4、字符串最前面的字符不是空格,字符串最后一个字符不是空格;
上面四种情况可以归纳为第一个单词,最后一个单词,第max+1个空格后面的单词,三个单词的比较,共9种结果
*/
//定义整型变量x,并赋值arr[max+1]-arr[max],如果x最大,那么字符串中第max+1个空格后面的单词最长
int x=arr[max+1]-arr[max];
//定义整型变量y,并赋值len-1-arr[a-1],如果y最大,那就是最后一个单词最长
int y=len-1-arr[a-1];
//定义整型变量z,并赋值arr[0],如果z最大,那就是第一个单词最长
int z=arr[0];
//用if语句分别判断9种情况,并打印输出相应结果
if (z>x) {
if (y>z) {printf("字符串中的最后一个单词最长\n");
}elseif(y==z){printf("字符串中的第一个和最后一个单词都是最长的\n");
}else{printf("字符串中的第一个单词最长\n");}
}
if (z<x) {
if (y>x) {printf("字符串中的最后一个单词最长\n");
}elseif(y==x){printf("字符串中最后一个单词和第%d个空格后面的单词都是最长\n",max+1);
}else{printf("字符串中第%d个空格后面的单词最长\n",max+1);}
}
if (z==x) {
if (z==y) {printf("字符串中的第一个、最后一个单词、第%d个空格后面的单词都是最长的\n",max+1);
}elseif(y>z){printf("字符串中的第一个单词最长\n");
}else{printf("字符串中的第一个单词和第%d个空格后面的单词都是最长的\n",max+1);}
}
}
//入口函数
int main(){
//定义char类型指针变量,并初始化赋值字符串
char *p="china americacanadauk ";
//调入定义的chaCha函数
chaCha(p);
return 0;
}
建议代码重新整理一下。这样太乱了没法看!