您好,欢迎来到[编程问答]网站首页   源码下载   电子书籍   软件下载   专题
当前位置:首页 >> 编程问答 >> C/C++ >> 多字符串,按第一个单词长度排序输出

多字符串,按第一个单词长度排序输出

来源:网络整理     时间:2016/7/20 15:29:55     关键词:

关于网友提出的“ 多字符串,按第一个单词长度排序输出”问题疑问,本网通过在网上对“ 多字符串,按第一个单词长度排序输出”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 多字符串,按第一个单词长度排序输出
描述:

本帖最后由 cNETLOOK 于 2010-01-27 00:07:58 编辑

/*
** 编写一个程序,读取输入,直到读入了10个
** 字符串或遇到EOF,由二者中最先被满足的那个终止读取过程。
** 这个程序可以为用户提供一个有5个选项的菜单;输出字符串列
** 表、按ASCII顺序输出字符串、按长度递增顺序输出字符串、按
** 字符串中第一个单词的长度输出字符串和退出。菜单可以循环,
** 直到用户输入退出请求。当然,程序要能真正完成菜单中的各项
** 功能。
*/
#include 
#include 
/*定义了用户输入的字符串最多为10个*/
#define ROWS 10
/*假设每一个字符串字符个数最多为81个*/
#define COLS 81 
/*读取字符串*/
int getL(char [][COLS]);
/*打印菜单*/
int PrintMenu(void);
/*输出字符串*/
void putStr(const char [][COLS],int);
/*按第一个单词长度输出字符串*/
void sortWdPuts(char [][COLS],int);
/*按字符串长度递增顺序输出字符串*/
void sortStrPuts(const char [][COLS],int);
/*按ASCII表顺序输出字符串*/
void sortAsciiPuts(const char [][COLS],int);
int main(void)
{
char str[ROWS][COLS];
int nSCode;
int nLine;
/*返回读入的字符串数目*/
    nLine = getL(str);
do{
nSCode = PrintMenu();
switch(nSCode)
{
case 1:
    putStr(str,nLine);
break;
case 2:
sortWdPuts(str,nLine);
break;
case 3:
sortStrPuts(str,nLine);
break;
case 4:
sortAsciiPuts(str,nLine);
break;
default:
break;
};
    /*nSCode == 0时退出循环*/
}while(nSCode);
puts("Done!");
return 0; 
}
/*
** 打印菜单 
*/
int PrintMenu(void)
{
   int nSCode;
   puts("1 输出字符串列表\t\t2 按字符串中第一个单词的长度输出字符串");
   puts("3 按长度递增顺序输出字符串\t4 按ASCII顺序输出字符串\n0 Quit");
/*读入不成功则刷新缓冲区,重复读取直到成功*/
   while(scanf("%d",&nSCode) != 1 || (nSCode < 0 || nSCode > 4))
  {
   puts("Error! please try agen:\n");
   fflush(stdin);
   }
  return nSCode;
}
/*
** 读取字符串
*/
int getL(char pstr[][COLS])
{
  int ch;
  int i;
  int j;
  
  puts("请输入10个字符串行:");
  for(i = 0; i < ROWS; ++i)
  for(j = 0; j < COLS; ++j)
  if((ch = getchar()) != EOF && (ch != '\n') )
  {
  pstr[i][j] = ch;
  }
  else
  {
 pstr[i][j] = '\0';
 if(ch == EOF)
 return (i+1);
 else 
 break;
  }
  return (i+1);
}
/*
** 输出字符串
*/
void putStr(const char pstr[][COLS],int line)
{
int num = 0;
while(num < line)
        puts(pstr[num++]);
}
/*
** 按第一个单词长度输出字符串
*/
/*题目做到这里就没有思路了,请帮忙指点下, *******************************/
void sortWdPuts(char *pstr[ROWS],int line)
{
}
/*
** 按字符串长度递增顺序输出字符串
*/
void sortStrPuts(const char pstr[][COLS],int line)
{
;
}
/*
** 按ASCII表顺序输出字符串
*/
void sortAsciiPuts(const char pstr[][COLS],int line)
{
;
}

解决方案1:

链表或者用两个数组都可以。
链表是惯用方法,我就说数组吧
先把所有字符串第一个单词长度得到,然后这个长度放到一个int数组,对应的字符串放到另一个指针数组
这样把所有字符串信息都得到,得到的结果是一个数组放置第一个单词长度,而另一个数组放置对应字符串
他们的下标是相同的,然后你排列int数组,对应指针数组通过下标也就排出来了

解决方案2:

用快排实现,经测试没什么问题了,楼主快给我分哈

/*
** 编写一个程序,读取输入,直到读入了10个
** 字符串或遇到EOF,由二者中最先被满足的那个终止读取过程。
** 这个程序可以为用户提供一个有5个选项的菜单;输出字符串列
** 表、按ASCII顺序输出字符串、按长度递增顺序输出字符串、按
** 字符串中第一个单词的长度输出字符串和退出。菜单可以循环,
** 直到用户输入退出请求。当然,程序要能真正完成菜单中的各项
** 功能。
*/
#include 
#include 
#include 
#include 
/*定义了用户输入的字符串最多为10个*/
#define ROWS 10
/*假设每一个字符串字符个数最多为81个*/
#define COLS 81 
/*读取字符串*/
int getL(char [][COLS]);
/*打印菜单*/
int PrintMenu(void);
/*输出字符串*/
void putStr(const char [][COLS],int);
/*按第一个单词长度输出字符串*/
int WdCompare(const void *a,const void *b);
void sortWdPuts(const char [][COLS],int);
/*按字符串长度递增顺序输出字符串*/
int StrCompare(const void *a,const void *b);
void sortStrPuts(const char [][COLS],int);
/*按ASCII表顺序输出字符串*/
int ASCIICompare(const void *a,const void *b);
void sortAsciiPuts(const char [][COLS],int);
int main(void)
{
    char str[ROWS][COLS]={0};
    int nSCode;
    int nLine;
    /*返回读入的字符串数目*/
    nLine = getL(str);
    do{
        nSCode = PrintMenu();
        switch(nSCode)
        {
        case 1:
            putStr(str,nLine);
            break;
        case 2:
            sortWdPuts(str,nLine);
            break;
        case 3:
            sortStrPuts(str,nLine);
            break;
        case 4:
            sortAsciiPuts(str,nLine);
            break;
        default:
            break;
        };
    /*nSCode == 0时退出循环*/
    }while(nSCode);
    puts("Done!");
    return 0; 
}
/*
** 打印菜单 
*/
int PrintMenu(void)
{
   int nSCode;
   puts("1 输出字符串列表\t\t2 按字符串中第一个单词的长度输出字符串");
   puts("3 按长度递增顺序输出字符串\t4 按ASCII顺序输出字符串\n0 Quit");
/*读入不成功则刷新缓冲区,重复读取直到成功*/
   while(scanf("%d",&nSCode) != 1 || (nSCode < 0 || nSCode > 4))
      {
       puts("Error! please try agen:\n");
       fflush(stdin);
   }
  return nSCode;
}
/*
** 读取字符串
*/
int getL(char pstr[][COLS])
{
  int ch;
  int i;
  int j;
  
  printf("请输入%d个字符串行:\n",ROWS);
  for(i = 0; i < ROWS; ++i)
      for(j = 0; j < COLS; ++j)
          if((ch = getchar()) != EOF && (ch != '\n') )
          {
              pstr[i][j] = ch;
          }
          else
          {
             pstr[i][j] = '\0';
             if(ch == EOF)
                 return (i+1);
             else 
                 break;
          }
          return (i);
}
/*
** 输出字符串
*/
void putStr(const char pstr[][COLS],int line)
{
    int num = 0;
    while(num < line)
        puts(pstr[num++]);
}
/*
** 按第一个单词长度输出字符串
*/
/*题目做到这里就没有思路了,请帮忙指点下, *******************************/
int WdCompare(const void *a,const void *b)
{
int i=0,j=0;
char *ptr1=(char *)a;
char *ptr2=(char *)b;
while(*ptr1 && *ptr1!=' ' && *ptr1!=',' && *ptr1!='.' && *ptr1!='?' && *ptr1!='!' && i<>
while(*ptr2 && *ptr2!=' ' && *ptr2!=',' && *ptr2!='.' && *ptr2!='?' && *ptr2!='!' && j<>
if(i<>
return i>j;
}
void sortWdPuts(const char pstr[][COLS],int line)
{
   char (*strs)[COLS];
   
   strs=(char (*)[COLS])malloc(line*COLS);
   if(strs==NULL) 
   {
   perror("malloc");
   return ;
   }
   memset(strs,0,COLS*line);
   memcpy(strs,pstr,COLS*line);
   qsort(strs,line,COLS,WdCompare);
   putStr(strs,line);
   free(strs);
}
/*
** 按字符串长度递增顺序输出字符串
*/
int StrCompare(const void *a,const void *b)
{
int i=0,j=0;
char *ptr1=(char *)a;
char *ptr2=(char *)b;
i = strlen(ptr1);
j = strlen(ptr2);
if(i<>
return i>j;
}
void sortStrPuts(const char pstr[][COLS],int line)
{
char (*strs)[COLS];
strs=(char (*)[COLS])malloc(line*COLS);
if(strs==NULL) 
{
perror("malloc");
return ;
}
memset(strs,0,COLS*line);
memcpy(strs,pstr,COLS*line);
qsort(strs,line,COLS,StrCompare);
putStr(strs,line);
    free(strs);
}
/*
** 按ASCII表顺序输出字符串
*/
int ASCIICompare(const void *a,const void *b)
{
char *ptr1=(char *)a;
char *ptr2=(char *)b;
if((char)*ptr1<(char)*ptr2) return -1;
return (char)*ptr1>(char)*ptr2;
}
void sortAsciiPuts(const char pstr[][COLS],int line)
{
char (*strs)[COLS];
strs=(char (*)[COLS])malloc(line*COLS);
if(strs==NULL) 
{
perror("malloc");
return ;
}
memset(strs,0,COLS*line);
memcpy(strs,pstr,COLS*line);
qsort(strs,line,COLS,ASCIICompare);
putStr(strs,line);
    free(strs);
}
解决方案3:

引用 11 楼 guoyu_bo 的回复:
至于操作用一个结构体来做
typedef struct list
{
char *data;
        int num; /单词长度
struct list *next;
} list_t;
排序就成了链表的插序了

正解,这样排序肯定没问题,能实现你想要的结果! 解决方案4:

至于操作用一个结构体来做
typedef struct list
{
char *data; 
        int num; /单词长度
struct list *next; 
} list_t;
排序就成了链表的插序了

解决方案5:

弄一个字符串指针数组,一个第一个单词长度数组,然后按照后一个数组排序。

解决方案6:

用strstr(cBuff, "\0")即可计算出第一个单词长度了。。

解决方案7:

用sscanf()取出第一个单词,再求第一个单词的长度然后比较?
也可以直接在字符串中找第一个空格吧,遇到空格就计算单词长度


以上介绍了“ 多字符串,按第一个单词长度排序输出”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/itwd/2829347.html

相关图片

相关文章