黑马程序员技术交流社区

标题: 我又来提问了。基础测试老出问题呢。。。 [打印本页]

作者: rocki    时间: 2014-7-14 21:37
标题: 我又来提问了。基础测试老出问题呢。。。
本帖最后由 rocki 于 2014-7-15 10:16 编辑

我这个程序排序的时候一会对一会不对。大家看看哪里出得问题呢
  1. /*9、 从键盘输入6个字符串(仅仅包含英文字母和数字),对这6个字符串从小到大排列并输出结果。(C语言)*/

  2. #include <stdio.h>
  3. #include <string.h>
  4. int i;//用于控制循环
  5. char a[6][100];//存贮6组字符串。每组长度100
  6. int main(int argc, const char * argv[])
  7. {
  8.     //声明排序函数
  9.     void sort();
  10.     //接收用户输入字符串
  11.     for (i=0; i<6; i++)
  12.     {
  13.         printf("请输入第%d个字符串\n",i+1);
  14.         scanf("%s",a[i]);
  15.     }
  16.     //调用排序函数
  17.     sort();
  18.     //打印排序后字符串
  19.     printf("排序后:\n");
  20.     for (i=0; i<6; i++)
  21.     {
  22.         printf("%s\n",a[i]);
  23.     }
  24.    
  25.     return 0;
  26. }
  27. void sort()
  28. {
  29.     char s[100];//交换用临时变量
  30.     int j;//控制循环
  31.    
  32.     //排序
  33.     for (j=0; j<6;j++)
  34.     {
  35.         for(i=0;i<6-j;i++)
  36.         {
  37.         
  38.             if (strcmp(a[i], a[i+1])< 0)//如果相邻两个字符串比较返回值小于0则执行
  39.                                         //下面交换
  40.             {
  41.                
  42.                 strcpy(s, a[i]);
  43.                 strcpy(a[i], a[i+1]);
  44.                 strcpy(a[i+1], s);
  45.             }
  46.         }
  47.     }
  48.    
  49. }
复制代码

作者: 小海    时间: 2014-7-14 21:52
我想可能是这个原因:strcmp这个函数只能比较字符串的大小, 是按ASCLL码值比较的,如果它比较到的两个字符一个是字母一个是数字,它就会直接把这个数字当作ASCLL值了,你的sort函数不能直接调用strcmp函数比较字符串大小,想想其他办法吧
作者: rocki    时间: 2014-7-14 21:56
小海 发表于 2014-7-14 21:52
我想可能是这个原因:strcmp这个函数只能比较字符串的大小, 是按ASCLL码值比较的,如果它比较到的两个字符 ...

我去。。你说这个我还真没考虑到。
作者: fantacyleo    时间: 2014-7-14 22:09
标题: i
本帖最后由 fantacyleo 于 2014-7-14 22:12 编辑

你不是升序排列么?为啥strcmp(a, a[i+1])< 0时还做交换呢?更大的问题是,sort()中当j=0时,内循环变量i是越界的: i=5时,你将访问a[i+1]即a[6],越界!这意味着你【可能】会把未知字符串copy到原数组中,当然排序会不对拉
作者: rocki    时间: 2014-7-14 22:27
fantacyleo 发表于 2014-7-14 22:09
你不是升序排列么?为啥strcmp(a, a)< 0时还做交换呢?更大的问题是,sort()中当j=0时,内循环变量i是越界 ...

一针见血。。不过楼上给我说了那个问题之后。这个方案放弃了。  
作者: 爱情路13号    时间: 2014-7-15 03:00
小海 发表于 2014-7-14 21:52
我想可能是这个原因:strcmp这个函数只能比较字符串的大小, 是按ASCLL码值比较的,如果它比较到的两个字符 ...

对的,字符串的大小就是按照ASCII码的值大小作为大小判断的
作者: gxppq    时间: 2014-12-18 09:12
小海 发表于 2014-7-14 21:52
我想可能是这个原因:strcmp这个函数只能比较字符串的大小, 是按ASCLL码值比较的,如果它比较到的两个字符 ...

如果定义的两个变量是字符型串。strcmp函数不会把数字作为ASCLL值。我们可以用下面一小段代码进行验证。
  1. #include <stdio.h>
  2. #include <string.h>
  3. void main()
  4. {
  5.         int a;
  6.         a=(strcmp("*","1"));
  7.         printf("%d\n",a);
  8. }
复制代码

这段代码主要是比较了字符“*”和字符“1”的大小。“*”的ASCLL码值是42,“1”的ASCLL码值是49。如果strcmp是严格按照ASCLL码值进行比较,那么“*”的ASCLL码值小于“1”的ASCLL码值,那么程序会输出一个负值。如果strcmp会把数字作为ASCLL码值,那么“*”的ASCLL码值大于1,那么程序会输出一个正值。最终程序输出的是一个负值。这说明strcmp不会把数字作为ASCLL码值进行处理。
    另外,在用strcmp函数进行字符串的大小比较时,必须在定义比较的两个变量是字符型的,如果不是字符型,在编译时程序会报错,“cannot convert parameter 2 from 'const int' to 'const char *'”,即不能进行整型与字符型的转换。
    ps:我用的是VC6.0进行编译和运行,以上意见只为表示在VC6.0上的验证结果。不代表其他开发工具或编译器上运行的结果。可能编译器和开发工具不同,运行的结果也会不同。




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