黑马程序员技术交流社区

标题: 请教:第23行代码出bug,总是给最后一个空格怎么办? [打印本页]

作者: 达摩八戒    时间: 2014-9-17 22:16
标题: 请教:第23行代码出bug,总是给最后一个空格怎么办?
  1. #include<stdio.h>
  2. //定义有参无返回值的函数,形参为char类型的指针变量
  3. voidchaCha(char *p){
  4. //定义整型变量a,len,并初始化赋值0
  5. int a=0;
  6. intlen=0;
  7. //定义字符型变量key,并初始化赋值' ',key即表示字符串中的空格字符
  8. char key=' ';
  9. //循环遍历,直到*(p+len)=='\0'时为止,遍历时len++,所得len即为字符串的长度
  10. for (inti=0; *(p+len)!='\0'; i++) {
  11. len++;
  12.     }
  13. //循环遍历,直到*(p+len)=='\0'时为止,遍历中,如果*(p+i)是空格,a增加1个(a++),最后所得a即为空格数量
  14. for (inti=0; i<len; i++) {
  15. if (*(p+i)==key) {
  16. a++;
  17.         }
  18.     }
  19. //定义整型数组arr[a]
  20. intarr[a];
  21. //循环遍历字符串指针指向的字符*(p+j)是否等于空格,等于就让数组arr[a]的元素依次等于字符的下标j
  22. //循环遍历以上步骤,可使数组元素值依次等于字符串中空格的下标
  23. [color=Red][b]???这里总是找出最后一个空格,前面的空格找不到是怎么回事?[/b][/color]
  24. for (inti=0; i<a; i++) {
  25. for (int j=0; j<len; j++) {
  26. if (*(p+j)==key) {
  27. arr[i]=j;
  28.             }
  29.         }
  30.     }
  31. //定义整型数组arr1[a-1]
  32. int arr1[a-1];
  33. //循环遍历整型数组arr1[a-1],使数组arr1的元素值等于数组arr相应元素(字符串中空格的下标)之差,arr1[i]=arr[i+1]-arr[i]
  34. for (inti=0; i<a-1; i++) {
  35. arr1[i]=arr[i+1]-arr[i];
  36.     }
  37. //找数组arr1[a-1]中的最大数,并记录下标,也就是数组arr相应元素之差最大,也就是字符串中空格的下标之差最大,即两个空格之间的单词最长
  38. int max=0;
  39. for (inti=0; i<a-1; i++) {
  40. if (arr1[max]<arr1[i]) {
  41. max=i;
  42.         }
  43.     }
  44. //arr1[max]就是数组arr1[a-1]中的最大数,又因为arr1[i]=arr[i+1]-arr[i]
  45. //所以字符串中,空格之间的单词中,第max个空格和第max+1个空格中间的单词最长
  46. /*四种情况
  47.      1、字符串最前面的字符不是空格,字符串最后一个字符是空格;
  48.      2、字符串最前面的字符是空格,字符串最后一个字符不是空格;
  49.      3、字符串最前面的字符是空格,字符串最后一个字符是空格;
  50.      4、字符串最前面的字符不是空格,字符串最后一个字符不是空格;
  51. 上面四种情况可以归纳为第一个单词,最后一个单词,第max+1个空格后面的单词,三个单词的比较,共9种结果
  52.      */
  53. //定义整型变量x,并赋值arr[max+1]-arr[max],如果x最大,那么字符串中第max+1个空格后面的单词最长
  54. int x=arr[max+1]-arr[max];
  55. //定义整型变量y,并赋值len-1-arr[a-1],如果y最大,那就是最后一个单词最长
  56. int y=len-1-arr[a-1];
  57. //定义整型变量z,并赋值arr[0],如果z最大,那就是第一个单词最长
  58. int z=arr[0];
  59. //用if语句分别判断9种情况,并打印输出相应结果
  60. if (z>x) {
  61. if (y>z) {printf("字符串中的最后一个单词最长\n");
  62.         }elseif(y==z){printf("字符串中的第一个和最后一个单词都是最长的\n");
  63.         }else{printf("字符串中的第一个单词最长\n");}
  64.     }
  65. if (z<x) {
  66. if (y>x) {printf("字符串中的最后一个单词最长\n");
  67.         }elseif(y==x){printf("字符串中最后一个单词和第%d个空格后面的单词都是最长\n",max+1);
  68.         }else{printf("字符串中第%d个空格后面的单词最长\n",max+1);}
  69.     }
  70. if (z==x) {
  71. if (z==y) {printf("字符串中的第一个、最后一个单词、第%d个空格后面的单词都是最长的\n",max+1);
  72.         }elseif(y>z){printf("字符串中的第一个单词最长\n");
  73.         }else{printf("字符串中的第一个单词和第%d个空格后面的单词都是最长的\n",max+1);}
  74.     }
  75. }
  76. //入口函数
  77. int main(){
  78. //定义char类型指针变量,并初始化赋值字符串
  79. char *p="china americacanadauk ";
  80. //调入定义的chaCha函数
  81. chaCha(p);
  82. return 0;
  83. }
复制代码

作者: 陨石    时间: 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