【C语言】——C Primer Plus 第十一章 第11题

编写一个函数,读入10个字符串或者读到EOF时停止。该程序为用户提供一个有5个选项的菜单:打印源字符串列表、以ASCII中的顺序打印字符串、按长度递增顺序打印字符串、按字符串中第1个单词的长度打印字符串、退出。菜单可以循环显示,除非用户选择退出选项。当然,该程序要能真正完成菜单中各选项的功能
这十个句子可以在程序中直接粘贴

a university to relax
Is the university a place to relax?
However I think we had better
word the university
knowledge and make friends
after four
you will make a great
Many people think the university
As far
We can learn a lot

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 10  
#define M 100
typedef struct string{//定义包括字符串和首单词长度的结构体 
 char str[M];
 int count;
}STR,*PSTR;
void sc(char**);//原字符串输出函数 
void asc(char**);//按ASCII码输出函数 
void lsc(char**);//按长度递增顺序输出函数 
void flsc(char**);//按首单词长度递增顺序输出函数
int dxxz();//包括五个选择的大函数 
void jgtsc(PSTR);//将结构体进行比较然后输出

int main()
{
 while(1)
  if(dxxz()==0)
  return 0;  
    return 0;
}

int dxxz(){
 char *str1[N];
 int i;
 getchar();//菜单循环显示时吃掉一个回车 
 for(i=0;i<N;i++){
  str1[i]=(char*)malloc(M);//为指针分配存储空间否则只能给一个指针赋值 
  fgets(str1[i],M,stdin);
 }
 printf("您有五个选项\n");
 printf("选项1:打印原字符串列表\n");
 printf("选项2:按ASCII码的顺序打印字符串列表\n");
 printf("选项3:按长度递增的顺序打印字符串列表\n");
 printf("选项4:按第一个单词的长度打印字符串列表\n");
 printf("选项5:退出\n");
 printf("请选择:");
 scanf("%d",&i);
 switch(i){
  case 1:sc(str1);break;
  case 2:asc(str1);break;
  case 3:lsc(str1);break;
  case 4:flsc(str1);break;
  case 5:return 0;break;
 } 
 for(i=0;i<N;i++){//将动态内存释放掉 
  free(str1[i]);
 }
}

void sc(char**str1){
 int i;
 for(i=0;i<N;i++){
  fputs(str1[i],stdout);//输出字符串 
 }
}

void asc(char**str1){
 int i,j;
 char *t;
 for(i=0;i<N;i++){//冒泡法
  for(j=0;j<N-1-i;j++){
   if(strcmp(str1[j],str1[j+1])>0){//按ASCII码比较首字母的大小 
    t=str1[j];//交换指针的位置
    str1[j]=str1[j+1];
    str1[j+1]=t;
   }
  }
 }
 sc(str1);
}

void lsc(char**str1){
 int i,j;
 char *t;
 for(i=0;i<N;i++){//冒泡法 
  for(j=0;j<N-1-i;j++){
   if(strlen(str1[j])>strlen(str1[j+1])){//比较字符串长度 
    t=str1[j];//交换指针的位置 
    str1[j]=str1[j+1];
    str1[j+1]=t;
   }
  }
 }
 sc(str1);
}

void flsc(char**str){
  char str1[N][M];
  int i,j,count=0;
  PSTR p;
  p=(PSTR)malloc(N*sizeof(STR));
  //定义一个可以动态分配内存的指针p,结构体数组才能循环赋值   
  for(i=0;i<N;i++)
     //str1[i][M]=*str[i];//错误的赋值方式 
     strcpy(str1[i],str[i]);//字符数组定义时如果不初始化便只能采取这种方式赋值 
                            //将这十个字符串存到二维数组中方便找到空格
  for(i=0;i<N;i++){
   for(j=0;j<M;j++){
    if(str1[i][j]!=' ')
      count++;//计算第一个单词长度 
    else{
     strcpy(p[i].str,str[i]);//p[i].str是一个指针 
     p[i].count=count;//赋值 
     count=0;//count归零,重新计数 
     break;//结束内循环 
    }
   }
  }
  jgtsc(p);
  for(i=0;i<N;i++)
  free(p+i);
}

void jgtsc(PSTR p){
 int i,j;
 STR temp;
 for(i=0;i<N;i++){//冒泡法 
  for(j=0;j<N-1-i;j++){
   if(p[j].count>p[j+1].count){//比较第一个单词长度 
    temp=p[j];//直接交换结构体 
    p[j]=p[j+1];
    p[j+1]=temp;
   }
  }
 }
 for(i=0;i<N;i++)
     printf("%s\n",p[i].str);//输出字符串 
}
/*
总结:思路比较清晰,但需要注意的细节很多
比如指针数组,字符型二维数组,结构体数组的循环赋值 
-----------------------
在dev中输出结果为 
正确,但是太长就不粘贴了 
----------------------- 
*/
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值