A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

6 个回复

倒序浏览
我想可能是这个原因:strcmp这个函数只能比较字符串的大小, 是按ASCLL码值比较的,如果它比较到的两个字符一个是字母一个是数字,它就会直接把这个数字当作ASCLL值了,你的sort函数不能直接调用strcmp函数比较字符串大小,想想其他办法吧

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

回复 使用道具 举报
小海 发表于 2014-7-14 21:52
我想可能是这个原因:strcmp这个函数只能比较字符串的大小, 是按ASCLL码值比较的,如果它比较到的两个字符 ...

我去。。你说这个我还真没考虑到。
回复 使用道具 举报

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到原数组中,当然排序会不对拉

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

回复 使用道具 举报
fantacyleo 发表于 2014-7-14 22:09
你不是升序排列么?为啥strcmp(a, a)< 0时还做交换呢?更大的问题是,sort()中当j=0时,内循环变量i是越界 ...

一针见血。。不过楼上给我说了那个问题之后。这个方案放弃了。  
回复 使用道具 举报
小海 发表于 2014-7-14 21:52
我想可能是这个原因:strcmp这个函数只能比较字符串的大小, 是按ASCLL码值比较的,如果它比较到的两个字符 ...

对的,字符串的大小就是按照ASCII码的值大小作为大小判断的
回复 使用道具 举报
gxppq 中级黑马 2014-12-18 09:12:38
7#
小海 发表于 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上的验证结果。不代表其他开发工具或编译器上运行的结果。可能编译器和开发工具不同,运行的结果也会不同。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马