黑马程序员技术交流社区

标题: 这个排序 我不知道是哪里错了 [打印本页]

作者: 学以致用表初衷    时间: 2016-1-15 09:04
标题: 这个排序 我不知道是哪里错了
本帖最后由 学以致用表初衷 于 2016-1-15 10:05 编辑
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(int argc, const char * argv[]) {
  4.     char *guoJia[]={"Ameirica","japan","korea","china","africa","freanch"};
  5.     char lenth=strlen(*guoJia); //这里 lenth 输入的是8  但是下边就运算不了。
  6.                                                      //如果改成 char lenth =strlen(guojia); lenth =2; 下边输出的就是 ameirica 和 japan 不符合运算了
  7.     printf("%d\n",lenth);
  8.    

  9.     for (int i=0; i<lenth-1; i++)
  10.         {
  11.         for (int j=0; j<lenth-i-1; j++)
  12.         {
  13.             
  14.             if ((strcmp(guoJia[j], guoJia[j+1]))>0)
  15.             {
  16.                 char *ch;
  17.                
  18.                 ch =guoJia[j];
  19.                 guoJia[j]=guoJia[j+1];
  20.                 guoJia[j+1]=ch;

  21.             }
  22.             
  23.                
  24.                
  25.         }
  26.             
  27.         }
  28.     for (int j=0; j<lenth; j++)
  29.     {
  30.         printf("%s\n",guoJia[j]);
  31.     }
  32.    

  33.        }
复制代码


作者: 学以致用表初衷    时间: 2016-1-15 09:49
我研究出来一个
因为我长度是地址 所以lenth 应该是用strlen;
  但是后边还是不对啊。
作者: 学以致用表初衷    时间: 2016-1-15 10:07
我都蒙圈了。。我找到了一个以前上课做的。
  1. #include <stdio.h>
  2. #include<string.h>
  3. int main(int argc, const char * argv[]) {
  4.     char  *name[]={"CHINA","AMERICA","AUSTRALIA","FRANCE","GERMAN"};
  5.     char   lenth =strlen(*name);
  6.     for (int i=0; i<lenth-1; i++)

  7.     {
  8.         for (int j=0; j<lenth-i-1; j++)
  9.         {
  10.             if ((strcmp(name[j], name[j+1]))>0)
  11.                
  12.             {
  13.                 char *temp;
  14.                 temp= name[j];
  15.                 name[j]=name[j+1];
  16.                 name[j+1]=temp;            }
  17.         }
  18.     }
  19.    
  20.     for (int j=0; j<lenth; j++)
  21.     {
  22.         printf("*name[%d]=%s\n",j,name[j]);
  23.     }
  24.    
  25.    
  26.     return 0;
  27. }
复制代码

对比半天也不知道到底错在哪里啊。。。
作者: 15223245    时间: 2016-1-15 11:06
本帖最后由 15223245 于 2016-1-15 11:09 编辑
  1. <blockquote>错误原因 :数组越界,数组长度计算错误。 解决办法
复制代码

作者: 15223245    时间: 2016-1-15 11:07
15223245 发表于 2016-1-15 11:06

数组越界,原因是  数组长度计算错误
作者: 15223245    时间: 2016-1-15 11:10
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(int argc, const char * argv[]) {
  4.     char *guoJia[]={"Ameirica","japan","korea","china","africa","freanch"};
  5.       char  lenth =sizeof(guoJia)/sizeof(guoJia[0]); //这里 lenth 输入的是8  但是下边就运算不了。
  6.     //如果改成 char lenth =strlen(guojia); lenth =2; 下边输出的就是 ameirica 和 japan 不符合运算了
  7.     printf("%d\n",lenth);


  8.     for (int i=0; i<lenth-1; i++)
  9.     {
  10.         for (int j=0; j<lenth-i-1; j++)
  11.         {

  12.             if ((strcmp(guoJia[j], guoJia[j+1]))>0)
  13.             {
  14.                 char *ch;

  15.                 ch =guoJia[j];
  16.                 guoJia[j]=guoJia[j+1];
  17.                 guoJia[j+1]=ch;

  18.             }



  19.         }

  20.     }
  21.     for (int j=0; j<lenth; j++)
  22.     {
  23.         printf("%s\n",guoJia[j]);
  24.     }


  25. }


复制代码


你的错误原因      数组长度计算错误
作者: 学以致用表初衷    时间: 2016-1-15 11:38
15223245 发表于 2016-1-15 11:07
数组越界,原因是  数组长度计算错误

那我应该怎么改正啊?
我已经求出来 数组长度为8了。。。
为什么if那里就出错呢
作者: 15223245    时间: 2016-1-15 13:13
学以致用表初衷 发表于 2016-1-15 11:38
那我应该怎么改正啊?
我已经求出来 数组长度为8了。。。
为什么if那里就出错呢 ...

数组的长度为6 。。。。

char  lenth =sizeof(guoJia)/sizeof(guoJia[0]);
作者: 学以致用表初衷    时间: 2016-1-15 13:43
15223245 发表于 2016-1-15 13:13
数组的长度为6 。。。。

char  lenth =sizeof(guoJia)/sizeof(guoJia[0]);

666666~~给你个赞。
那哥们 给我分析一下。
为什么strlen 求出来的就是8.
并且不允许进行下一步了呢。
你看我三楼 在课堂上写的那个。
那个和我这个 感觉没什么区别啊。。。
作者: 学以致用表初衷    时间: 2016-1-16 07:30
.....没人理我了啊。。
作者: 15223245    时间: 2016-1-16 10:13
学以致用表初衷 发表于 2016-1-16 07:30
.....没人理我了啊。。

数组的长度不是那样求的,,所以在循环的时候超出了数组长度范围,发生访问了坏的内存,也就是越界了
作者: 小石头16544    时间: 2016-1-17 14:08
strlen是求字符串长度的,不能用来求数组长度啊,数组长度length = sizeof (guojia)/sizeof (char * )
作者: 15931110616    时间: 2016-1-19 15:30
char   lenth =strlen(*name);  把这里的*去掉试试 我感觉是这个原因  。*name就是a[0].是个地址。 所有的地址存储都是八个字节 ,如果你printf之后   strlen是8  的话   有可能就是这个原因
作者: 15931110616    时间: 2016-1-19 15:38
不好意思 我想错了 不是那样的
作者: 15931110616    时间: 2016-1-19 15:40
char lenth=strlen(*guoJia);   为什么这里lenth是char类型的?
作者: guyuexing    时间: 2016-1-19 17:52
学习了!
作者: 学以致用表初衷    时间: 2016-1-20 07:39
15931110616 发表于 2016-1-19 15:40
char lenth=strlen(*guoJia);   为什么这里lenth是char类型的?

因为你输入的时字符串啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2