黑马程序员技术交流社区
标题:
请教:第23行代码出bug,总是给最后一个空格怎么办?
[打印本页]
作者:
达摩八戒
时间:
2014-9-17 22:16
标题:
请教:第23行代码出bug,总是给最后一个空格怎么办?
#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
//循环遍历以上步骤,可使数组元素值依次等于字符串中空格的下标
[color=Red][b]???这里总是找出最后一个空格,前面的空格找不到是怎么回事?[/b][/color]
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;
}
复制代码
作者:
陨石
时间:
2014-9-18 10:12
循环有了结果要break
作者:
陨石
时间:
2014-9-18 10:16
a即为空格数量
arr是想存放所有的空格位置
len是字符串长度
for (inti=0; i<a; i++) {
for (int j=0; j<len; j++) {
//在这里会依次找到字符串里的空格
if (*(p+j)==key) {
arr[i]=j;
//如果不break会将字符串里的空格都赋给当前的arr[i]中。比如当前的arr[0]那会空格从如len的第1个空格赋到最后一个。
所以要加break;
}
}
}
作者:
陨石
时间:
2014-9-18 10:18
值被覆盖了
作者:
陨石
时间:
2014-9-18 10:30
j 的初始值也要处理下,是上一个被记录的空格的下一个位置
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2