免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5239 | 回复: 9
打印 上一主题 下一主题

[C] 请教:按照输入字符串的第一个单词的长度将字符串排序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-07-11 14:02 |只看该作者 |倒序浏览
各位达人,最近做一个练习题,当中有个题目要求按照输入字符串的第一个单词的长度将整个字符串按照从小到大的顺序来排列,例如,输入了以下10个字符串:
Like your life.
Protecting your dignity.
Your parents love you.
Love your hobby.
The child is cute.
Complete your work.
Loading data.
Long for your things.
Shut down your computer.
system.

排列的结果应为:
The child is cute.
Like your life.
Your parents love you.
Love your hobby.
Long for your things.
Shut down your computer.
Loading data.
system.
Complete your work.
Protecting your dignity.

我按照自己的理解写了如下实现,不过并未达到预期效果。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <ctype.h>

  4. #define MAX 81
  5. #define SIZE 10

  6. void srt_str_fstwdlen(char *ar[], int n);

  7. int main(void)
  8. {
  9.     char str[SIZE][MAX];
  10.     int choice, i = 0;
  11.     char * ptr[SIZE];

  12.     printf("Input %d strings (to quit, press Enter at the beginning of a line):\n", SIZE);
  13.     while( i < SIZE  && gets(str[i]) != NULL && str[i][0] != '\0')
  14.     {
  15.          ptr[i] = str[i];  //用ptr[i]拷贝源字符串的指针以便传送给srt_str_fstwdlen()
  16.          i++;
  17.     }
  18.     if(str[0] != NULL)
  19.         srt_str_fstwdlen(ptr, i);

  20.     puts("Done!");
  21.     return 0;
  22. }

  23. void srt_str_fstwdlen(char *ar[], int n)
  24. {
  25.     int i , j;
  26.     char * temp;
  27.     char wd[SIZE][MAX];  //用以收集每个字符串中的第一个单词

  28.     for(i = 0; i < n; i++)
  29.             for(j = 0; j < MAX; j++)
  30.             {
  31.                 if(isspace(ar[i][j]))
  32.             {
  33.                 wd[i][j] = '\0';    //将从源字符串拷贝过来的字符形成字符串
  34.                 break;
  35.             }
  36.                 wd[i][j] = ar[i][j];
  37.             }
  38.    for(i = 0; i < n - 1; i++)        //排序过程
  39.    {
  40.            for(j = i + 1; j < n; j++)
  41.                if(strlen(wd[i]) > strlen(wd[j]))
  42.             {
  43.                temp = ar[i];                           //由于wd[i]中的字符串的顺序与ar[i]中
  44.                ar[i] = ar[j];                         //字符串的顺序相同,因此尝试用wd[i]字符串
  45.                ar[j] = temp;                       //的长度比较作为条件,然后实际对ar[i]中
  46.             }                                             //的字符串进行换位以达到排序的目的。但是,
  47.     }                                                   //看来问题就是出在这里了。  
  48.    puts("\nAfter sorting:");
  49.    for(i = 0; i < n; i++)
  50.        puts(ar[i]);
  51. }
复制代码
以上代码中应该是排序的做法不对,请各位指点一下应该如何处理。谢谢!

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2013-07-11 14:10 |只看该作者
这种排序还真是蛋疼啊

论坛徽章:
0
3 [报告]
发表于 2013-07-11 16:15 |只看该作者
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. int first_word_len(const char* str) {
  5.   int len = 0;
  6.   while (*str != '\0' && *str != ' ') {
  7.     len++;
  8.     str++;
  9.   }
  10.   return len;
  11. }

  12. int compare(const void* left, const void* right) {
  13.   return first_word_len(*(char* const*)left) >
  14.          first_word_len(*(char* const*)right);
  15. }

  16. int main() {
  17.   char* lines[] = {
  18.     "Like your life.",
  19.     "Protecting your dignity.",
  20.     "Your parents love you.",
  21.     "Love your hobby.",
  22.     "The child is cute.",
  23.     "Complete your work.",
  24.     "Loading data.",
  25.     "Long for your things.",
  26.     "Shut down your computer.",
  27.     "system.",
  28.   };
  29.   int len = sizeof(lines) / sizeof(char*);
  30.   int i;
  31.   qsort(lines, len, sizeof(char*), compare);
  32.   for (i = 0; i < len; ++i) {
  33.     puts(lines[i]);
  34.   }
  35.   return 0;
  36. }
复制代码

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
4 [报告]
发表于 2013-07-11 19:59 |只看该作者
qsort好牛逼

论坛徽章:
0
5 [报告]
发表于 2013-07-12 21:19 |只看该作者
mcmay 发表于 2013-07-11 14:02
各位达人,最近做一个练习题,当中有个题目要求按照输入字符串的第一个单词的长度将整个字符串按照从小到大 ...


为设么“system.”要排在“Loading data.”后呢?不是说好了是第一个单词的长度吗?所以此问题给出的示例结果有问题。另外,应该说明,如果两字符串的第一个单词的长度相等,则谁先谁后无所谓。

我的程序参见:http://kan.weibo.com/con/3599341697235962?_from=title

论坛徽章:
0
6 [报告]
发表于 2013-08-23 22:46 |只看该作者
感谢楼上诸兄参与本帖的讨论,特别是sqfasd和晓得飞天千秋雪二位还特别给出解决方案。sqfasd兄的解决方案似乎未能达到题目要求的结果,这一点经晓得飞天千秋雪兄测试也是如此。晓得飞天千秋雪兄在自己的微博中给出了他的解法,经过测试,可以说是比题目要求的结果还要准确。后来诸君可循其帖中给出的网址观之。在此,我也将CSDN上网友的一解贴出,以供参考。
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define MAX 81
#define SIZE 10

void srt_str_fstwdlen(char *ar[], int n);

int main(void)
{
    char str[SIZE][MAX];
    int choice, i = 0;
    char * ptr[SIZE];

    printf("Input %d strings (to quit, press Enter at the beginning of a line):\n", SIZE);
    while( i < SIZE  && gets(str[i]) != NULL && str[i][0] != '\0')
    {
         ptr[i] = str[i];  //用ptr[i]拷贝源字符串的指针以便传送给srt_str_fstwdlen()
         i++;
    }
    if(str[0] != NULL)
        srt_str_fstwdlen(ptr, i);

    puts("Done!");
    return 0;
}
void srt_str_fstwdlen(char *ar[], int n)
{
    int i , j, k;
    char * temp;
    char wd[SIZE][MAX];  //用以收集每个字符串中的第一个单词
    char tmp[81];    //

    for(i = 0; i < n; i++){
        for(j = 0; j < MAX; j++)
        {
            if(isspace(ar[i][j]))
            {
                wd[i][j] = '\0';    //将从源字符串拷贝过来的字符形成字符串
                break;
            }
            wd[i][j] = ar[i][j];
        }
   }
   for(i = 0; i < n - 1; i++)        //排序过程
   {
        for(j = i + 1; j < n; j++){
            if(strlen(wd[i]) > strlen(wd[j]))
            {
                       temp = ar[i];                       //由于wd[i]中的字符串的顺序与ar[i]中
               ar[i] = ar[j];                      //字符串的顺序相同,因此尝试用wd[i]字符串
               ar[j] = temp;                       //的长度比较作为条件,然后实际对ar[i]中

               strcpy(tmp,wd[i]);                  //比较的条件也要换位置,要不会出现重复比较
               strcpy(wd[i],wd[j]);
                       strcpy(wd[j],tmp);

            }
        }
    }
   puts("\nAfter sorting:");
   for(i = 0; i < n; i++)
       puts(ar[i]);   //注意这里
}

谢谢各位继续参与讨论!

论坛徽章:
0
7 [报告]
发表于 2013-08-25 15:22 |只看该作者
只是看单词长度,不需要比较同样长度顺序的话, 读进来就判断一下首字母长度,再存入一个指示长度的链表也行。不需要排序。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
8 [报告]
发表于 2013-08-27 14:30 |只看该作者

  1. #include <ctype.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. #define LENGTH(a) (sizeof(a)/sizeof((a)[0]))

  5. int get_first_word_length(const char *s)
  6. {
  7.         int i;

  8.         if (s != NULL) {
  9.                 for (i = 0; s[i] != '\0'; ++i) {
  10.                         if (!isalpha(s[i])) {
  11.                                 break;
  12.                         }
  13.                 }
  14.                 return i;
  15.         }
  16.         return 0;
  17. }

  18. int first_word_length_compare(const char **s1, const char **s2)
  19. {
  20.         int len1;
  21.         int len2;

  22.         len1 = get_first_word_length(*s1);
  23.         len2 = get_first_word_length(*s2);
  24.         if (len1 < len2) {
  25.                 return -1;
  26.         }else if (len1 > len2) {
  27.                 return 1;
  28.         }
  29.         return 0;
  30. }

  31. int main(void)
  32. {
  33.         static const char *table[] =
  34.         {
  35.                 "Like your life.",
  36.                 "Protecting your dignity.",
  37.                 "Your parents love you.",
  38.                 "Love your hobby.",
  39.                 "The child is cute.",
  40.                 "Complete your work.",
  41.                 "Loading data.",
  42.                 "Long for your things.",
  43.                 "Shut down your computer.",
  44.                 "system.",
  45.         };
  46.         int i;

  47.         qsort((char**)table, LENGTH(table), sizeof(char*), first_word_length_compare);
  48.         for (i = 0; i < LENGTH(table); ++i) {
  49.                 puts(table[i]);
  50.         }
  51.         return 0;
  52. }
复制代码

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
9 [报告]
发表于 2013-08-27 14:44 |只看该作者
加了点,若长度相等,则按首单词字母顺序排列。

  1. #include <ctype.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>

  5. #define LENGTH(a) (sizeof(a)/sizeof((a)[0]))

  6. int get_first_word_length(const char *s)
  7. {
  8.         int i;

  9.         if (s != NULL) {
  10.                 for (i = 0; s[i] != '\0'; ++i) {
  11.                         if (!isalpha(s[i])) {
  12.                                 break;
  13.                         }
  14.                 }
  15.                 return i;
  16.         }
  17.         return 0;
  18. }

  19. int first_word_length_compare(const char **s1, const char **s2)
  20. {
  21.         int len1;
  22.         int len2;

  23.         len1 = get_first_word_length(*s1);
  24.         len2 = get_first_word_length(*s2);
  25.         if (len1 < len2) {
  26.                 return -1;
  27.         }else if (len1 > len2) {
  28.                 return 1;
  29.         }
  30.         return strncmp(*s1, *s2, len1);
  31. }

  32. int main(void)
  33. {
  34.         static const char *table[] =
  35.         {
  36.                 "Like your life.",
  37.                 "Protecting your dignity.",
  38.                 "Your parents love you.",
  39.                 "Love your hobby.",
  40.                 "The child is cute.",
  41.                 "Complete your work.",
  42.                 "Loading data.",
  43.                 "Long for your things.",
  44.                 "Shut down your computer.",
  45.                 "system.",
  46.         };
  47.         int i;

  48.         qsort((char**)table, LENGTH(table), sizeof(char*), first_word_length_compare);
  49.         for (i = 0; i < LENGTH(table); ++i) {
  50.                 puts(table[i]);
  51.         }
  52.         return 0;
  53. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP