黑马程序员技术交流社区

标题: 在算法书上看到字符串排序问题 [打印本页]

作者: 王庆功    时间: 2014-9-27 10:14
标题: 在算法书上看到字符串排序问题
在算法书上看到字符串排序问题,自己就觉得没什么,随便写写吧。但是调了半天了都,就是有错误,而且还根据输入的字符串不一样,报错的地方不一样。郁闷死了。
题目要求:从键盘输入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. }
复制代码

作者: wanyiyuan    时间: 2014-9-27 10:30
期待大神来帮你解决
作者: rocki    时间: 2014-9-27 11:04
本帖最后由 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. }
复制代码

作者: 王庆功    时间: 2014-9-27 15:28
rocki 发表于 2014-9-27 11:04
if 里面用  strlen 计算长度。。别用strcmp。这个比较的是ASCII码。。 不是字符数。 所以你用这个就会出现 ...

字符串比较大小,就是得比较ASCII啊。字符串比较大小可不是以长度作为依据的
作者: 小叶子    时间: 2014-9-27 15:43
野指针错误
这么修改就对了
  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]);
复制代码





作者: 星河鹭起    时间: 2014-9-27 16:39
没搞懂你这个字符串从小到大排序意思,既然不是比较长度,那是比较什么??
作者: rocki    时间: 2014-9-27 20:35
本帖最后由 rocki 于 2014-9-27 20:37 编辑
王庆功 发表于 2014-9-27 15:28
字符串比较大小,就是得比较ASCII啊。字符串比较大小可不是以长度作为依据的 ...

比较ASCII码的话。 也就是是要逐一比较ASCII。 那你最后怎么去确定哪个字符串大? 难不成意思是字符串1ASCII码总和大于字符串2 就认定字符串1大? 这是一道基础测试题。我当时就是按长度去理解的。。 
作者: 王庆功    时间: 2014-9-28 09:20
rocki 发表于 2014-9-27 20:35
比较ASCII码的话。 也就是是要逐一比较ASCII。 那你最后怎么去确定哪个字符串大? 难不成意思是字符串1 ...

基础测试题都出到了这种程度?据我之前学的,字符串比较大小就是依次对s1和s2中对应位置上的字符两两比较,当出现第一个对不相同的字符时,这两个字符的大小就决定了所在串的大小。而且srcmp()函数就是来比较字符串大小的,这个函数比较的就是ascii值
作者: 王庆功    时间: 2014-9-28 09:21
本帖最后由 王庆功 于 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-28 09:49
星河鹭起 发表于 2014-9-27 16:39
没搞懂你这个字符串从小到大排序意思,既然不是比较长度,那是比较什么?? ...

对应的ASCII码值
作者: 王庆功    时间: 2014-9-28 09:55
小叶子 发表于 2014-9-27 15:43
野指针错误
这么修改就对了

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

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

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


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


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

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

也就是说。。。基础测试我做错了。。。老师没发现。。我累个擦。。
作者: 王庆功    时间: 2014-9-28 16:44
rocki 发表于 2014-9-28 12:49
也就是说。。。基础测试我做错了。。。老师没发现。。我累个擦。。

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




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