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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王庆功 中级黑马   /  2014-9-27 10:14  /  2295 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在算法书上看到字符串排序问题,自己就觉得没什么,随便写写吧。但是调了半天了都,就是有错误,而且还根据输入的字符串不一样,报错的地方不一样。郁闷死了。
题目要求:从键盘输入5个字符串,然后将这个5个字符串从小到大排序并输出。
我的代码:
  1. #import <Foundation/Foundation.h>
  2. #import <stdio.h>
  3. #import <string.h>

  4. int main()
  5. {
  6.         // 1.定义一个可以存放5个字符串的字符串数组
  7.         char str[5][10];
  8.         
  9.         // 2.提示用户从键盘输入字符串
  10.         for(int i = 0;i < 5;i++){
  11.             printf("请您输入第%d个字符串:",i+1);
  12.             scanf("%s",str[i]);
  13.         }

  14.         // 3.定义临时变量作为交换的中间变量
  15.         char  * temp;

  16.         for(int i = 0; i < 5;i++){   
  17.             for(int j = i + 1;j < 5;j++){  

  18.                 // 4.前后两个字符串做比较
  19.                 if( strcmp(str[i],str[j]) > 0){
  20.                 // 5.若后面字符串比前面这个小,则交换
  21.                     strcpy(temp,str[i]);
  22.                     strcpy(str[i],str[j]);
  23.                     strcpy(str[j], temp);
  24.                 }
  25.             }
  26.             
  27.         }
  28.   // 6.输出排序后的字符串
  29.     for(int i = 0;i < 5;i++){
  30.            printf("排序后的字符串:%s ",str[i]);
  31.     }
  32.    
  33.     return 0;
  34. }
复制代码

16 个回复

倒序浏览
期待大神来帮你解决
回复 使用道具 举报
本帖最后由 rocki 于 2014-9-27 11:13 编辑

if 里面用  strlen 计算长度。。别用strcmp。这个比较的是ASCII码。。 不是字符数。 所以你用这个就会出现结果混乱。
  1. #include <stdio.h>
  2. #include <string.h>
  3. int i;//用于控制循环
  4. char a[6][100];//存贮6组字符串。每组长度100
  5. int main(int argc, const char * argv[])
  6. {
  7.     //声明排序函数
  8.     void sort();
  9.    
  10.     //接收用户输入字符串
  11.     for (i=0; i<6; i++)
  12.     {
  13.         printf("请输入第%d个字符串\n",i+1);
  14.         scanf("%s",a[i]);
  15.     }
  16.    
  17.     //调用排序函数
  18.     sort();
  19.    
  20.     //打印排序后字符串
  21.     printf("排序后:\n");
  22.     for (i=0; i<6; i++)
  23.     {
  24.         printf("%s\n",a[i]);
  25.     }
  26.    
  27.     return 0;
  28. }
  29. void sort()
  30. {
  31.     char s[100];//交换用临时变量
  32.    
  33.     int j;//控制循环
  34.    
  35.     //冒泡排序
  36.     for (j=0; j<6;j++)
  37.     {
  38.         for(i=0;i<5-j;i++)
  39.         {
  40.             
  41.             if (strlen(a[i])<strlen(a[i+1]) )//比相邻两个字符串长度,如果后者大于前者,则执行下面交换
  42.             {
  43.                
  44.                 strcpy(s, a[i]);     //把较大者交换给前面
  45.                 strcpy(a[i], a[i+1]);
  46.                 strcpy(a[i+1], s);
  47.             }
  48.         }
  49.     }
  50.    
  51. }
复制代码
回复 使用道具 举报
rocki 发表于 2014-9-27 11:04
if 里面用  strlen 计算长度。。别用strcmp。这个比较的是ASCII码。。 不是字符数。 所以你用这个就会出现 ...

字符串比较大小,就是得比较ASCII啊。字符串比较大小可不是以长度作为依据的
回复 使用道具 举报
野指针错误
这么修改就对了
  1.   // 3.定义临时变量作为交换的中间变量
  2.     char  * temp=(char *)malloc(sizeof(temp));
复制代码

给temp先分配一个存储空间,
你接下来的cpy函数才能正确访问.
  1. // 4.前后两个字符串做比较
  2.             if( strcmp(str[i],str[j]) > 0){
  3.                 // 5.若后面字符串比前面这个小,则交换
  4.                 strcpy(temp,str[i]);
复制代码




回复 使用道具 举报
没搞懂你这个字符串从小到大排序意思,既然不是比较长度,那是比较什么??
回复 使用道具 举报
rocki 中级黑马 2014-9-27 20:35:26
7#
本帖最后由 rocki 于 2014-9-27 20:37 编辑
王庆功 发表于 2014-9-27 15:28
字符串比较大小,就是得比较ASCII啊。字符串比较大小可不是以长度作为依据的 ...

比较ASCII码的话。 也就是是要逐一比较ASCII。 那你最后怎么去确定哪个字符串大? 难不成意思是字符串1ASCII码总和大于字符串2 就认定字符串1大? 这是一道基础测试题。我当时就是按长度去理解的。。 

点评

有个东西叫“字典序”:逐位比较;以第一个不同的ascii码的大小决定字符串的大小,  发表于 2014-9-28 10:42
回复 使用道具 举报
rocki 发表于 2014-9-27 20:35
比较ASCII码的话。 也就是是要逐一比较ASCII。 那你最后怎么去确定哪个字符串大? 难不成意思是字符串1 ...

基础测试题都出到了这种程度?据我之前学的,字符串比较大小就是依次对s1和s2中对应位置上的字符两两比较,当出现第一个对不相同的字符时,这两个字符的大小就决定了所在串的大小。而且srcmp()函数就是来比较字符串大小的,这个函数比较的就是ascii值
回复 使用道具 举报
本帖最后由 王庆功 于 2014-9-28 09:47 编辑
  1. #include <stdio.h>
  2. #include <string.h>
  3. // 宏定义
  4. typedef char * string;

  5. int main()
  6. {
  7.     // 定义两个字符串变量
  8.     string str1 = "acd";
  9.     string str2 = "b";
  10.    
  11.     // 利用strcmp函数比较字符串大小
  12.     if(strcmp(str1,str2) > 0)
  13.     {
  14.         printf("%s\n",str1);
  15.     }
  16.     printf("%s\n",str2);
  17.   /*strcmp(s1,s2),如果串s1大于串s2,则结果大于0.如果小于,则结果小于零。如果等于,输出0
  18.    
  19.    此题的输出str2的字符串,说明strcmp(str1,str2)是小于0的,即str1<str2。显然不是长度,而是因为a的ASCII码值小于b的
  20.    */
  21.     return 0;
  22. }
复制代码

rocki 发表于 2014-9-27 20:35

比较ASCII码的话。 也就是是要逐一比较ASCII。 那你最后怎么去确定哪个字符串大? 难不成意思是字符串1 ...

基础测试题都出到了这种程度?据我之前学的,字符串比较大小就是依次对s1和s2中对应位置上的字符两两比较,当出现第一个对不相同的字符时,这两个字符的大小就决定了所在串的大小。而且srcmp()函数就是来比较字符串大小的,这个函数比较的就是ascii值。下面是我写的测试的代码:

回复 使用道具 举报
星河鹭起 发表于 2014-9-27 16:39
没搞懂你这个字符串从小到大排序意思,既然不是比较长度,那是比较什么?? ...

对应的ASCII码值
回复 使用道具 举报
小叶子 发表于 2014-9-27 15:43
野指针错误
这么修改就对了

谢谢你,错误就是在你说的地方。但是你的修改貌似有些问题吧,我改成了char temp[20],这样问题就解决了。而且我觉得说是“野指针”的话欠妥吧,我又查了一下,野指针是指指向僵尸对象的指针,现在这里没有僵尸对象,所以不能说是野指针吧。我觉得应该说是空指针比较好吧。
回复 使用道具 举报
王庆功 发表于 2014-9-28 09:55
谢谢你,错误就是在你说的地方。但是你的修改貌似有些问题吧,我改成了char temp[20],这样 ...

你改成char数组当然没问题,我之前说的修改,是因为你定义了一个指针,没有给指针分配内存就是用它了.

修改方式就是给指针分配一个内存,就可以了


你稍后修改的方式不是是用指针了,是直接定义一个char数组,当然也没问题喽~~~~


野指针和空指针,你现在这么说,我也不确定,我再研究下
回复 使用道具 举报
rocki 中级黑马 2014-9-28 12:47:13
13#
本帖最后由 rocki 于 2014-9-28 12:51 编辑
王庆功 发表于 2014-9-28 09:21
基础测试题都出到了这种程度?据我之前学的,字符串比较大小就是依次对s1和s2中对应位置上的字符两两 ...

明白你得意思了。  这确实是基础测试题。。  我当时也是用了 strcmp函数。我认为出问题了。。其实没有出问题,我潜在思维认为应该是按长度来的。所以我以为结果是错误的。实际是对的。。。 。。受教了!!
回复 使用道具 举报
rocki 中级黑马 2014-9-28 12:49:23
14#
王庆功 发表于 2014-9-28 09:21
基础测试题都出到了这种程度?据我之前学的,字符串比较大小就是依次对s1和s2中对应位置上的字符两两 ...

也就是说。。。基础测试我做错了。。。老师没发现。。我累个擦。。
回复 使用道具 举报
rocki 发表于 2014-9-28 12:49
也就是说。。。基础测试我做错了。。。老师没发现。。我累个擦。。

你怎么知道老师没发现?满分?

点评

是的。。满分。  发表于 2014-10-1 21:38
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马