编写一个函数,读入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中输出结果为
正确,但是太长就不粘贴了
-----------------------
*/