c语言bug 求助第23行:

在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。
找空格那里有问题
代码如下:

/*
 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;
}
阅读 3.7k
1 个回答

建议代码重新整理一下。这样太乱了没法看!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
101 新手上路
子站问答
访问
宣传栏