/*
编写一个函数,读入10个字符串或者读到EOF时停止。
该程序为用户提供一个有5个选项的菜单:
打印源字符串列表
以ASCII中的顺序打印字符串
按长度递增顺序打印字符串
按字符串中第1个单词的长度打印字符串
退出
菜单可以循环显示,除非用户选择退出选项。当然,该
程序要能真正完成菜单中各选项的功能。
*/
/*测试用字符串?
sadflkj
?dskfjs
fsdf
?dsfsd
sdf sdf sdf
sdfs
x
xcvcxv
b
a
*/
//测试用字符串?
//={" ?Jddd de","ISD","HS"," ASDFA DFDS","FW"," aEQWerw e","DBV","Cc","BS dD","A DFF"}
//{"J","I","H","G","F","E","D","C","B","A"};
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define SIZE 10
void get_string(char tr[][40]);
void bubble_sort(int arr[], int len);
int word_len(char *tr);
void repeat_zero(int len[]);
void a(char tr[][40]);
void b(char tr[][40]);
void c(char tr[][40]);
void d(char tr[][40]);
int main(void)
{?? ?
?? ?int i=0;
?? ?char strings[SIZE][40]={"\0"} ;
?? ?
?? ?printf("输入10个字符串 CTRL+Z结束\n");
?? ?get_string(strings);
?? ?printf("1.打印源字符串列表\n2.以ASCII中的顺序打印字符串\n3.按长度递增顺序打印字符串\n4.按字符串中第1个单词的长度打印字符串\n5 to quit\n");
?? ?while((scanf("%d",&i))!=EOF&&i>5)
?? ?{
?? ??? ?printf("1.打印源字符串列表\n2.以ASCII中的顺序打印字符串\n3.按长度递增顺序打印字符串\n4.按字符串中第1个单词的长度打印字符串\n5 to quit\n");
?? ??? ?while(getchar()!='\n')
?? ??? ??? ?continue;?? ?
?? ?}
?? ?switch(i)
?? ?{
? ? ? ? case 1: a(strings); break;
? ? ? ? case 2: b(strings); break;
? ? ? ? case 3: c(strings); break;
? ? ? ? case 4: d(strings); break;
? ? ? ? case 5: break;
? ? ? ? default:printf("erro"); break;
? ? }
?? ?return 0;
}
void get_string(char tr[][40])//读10个字符串?
{ ?
? ? int i;?
? ? for (i = 0; i < SIZE ; i++)?
? ? ?? ?fgets(tr[i], 40, stdin);//fgets读到EOF时会停止?
}
void bubble_sort(int arr[], int len) //冒泡排序?
{
? ? int i, j, temp;
? ? for (i = 0; i < len - 1; i++)
? ? ? ? for (j = 0; j < len - 1 - i; j++)
? ? ? ? ? ? if (arr[j] > arr[j + 1])?
?? ??? ??? ?{
? ? ? ? ? ? ? ? temp = arr[j];
? ? ? ? ? ? ? ? arr[j] = arr[j + 1];
? ? ? ? ? ? ? ? arr[j + 1] = temp;
?? ??? ??? ?}
}
int word_len(char *tr)//取词长
{
?? ?int i=0,flag=0,j=0;
?? ?while(tr[i]==' '&&i<40)
?? ??? ?i++;
??? ?while((tr[i]!=' '&&tr[i]!='\0'&&tr[i]!='\n'&&tr[i]!='\t')&&i<40)
?? ?{
?? ??? ?i++;
??? ??? ?j++;?? ??
?? ?}
?? ?return j;?
}//写的不是很好,不过能用.?
void repeat_zero(int len[])//重复改为0?
{
?? ?int i;
?? ?
?? ?for(i=0;i<SIZE;i++)
?? ?{
?? ??? ?if(len[i]==len[i+1])
?? ??? ??? ?len[i]=0;
?? ?}
}
void a(char tr[][40])
{
?? ?int i;
?? ?for(i=0;i<SIZE;i++)
?? ??? ?printf("tr[%d]=%s\n",i,tr[i]);
}
void b(char tr[][40])//对首字母进行冒泡排序得到新的数组后去重,让tr按照去重后的数组输出?
{
?? ?int asc[SIZE]={0};
?? ?int i,j,k;
?? ?
?? ?for(i=0;i<SIZE;i++)
?? ?{?? ?
?? ??? ?j=0;
?? ??? ?while(tr[i][j]==' ')
?? ??? ??? ?j++;
?? ??? ?asc[i] = tr[i][j];
?? ?}
?? ?bubble_sort(asc,SIZE);
?? ?repeat_zero(asc);
?? ?for(i=0;i<SIZE;i++)
?? ?{
?? ??? ?if(asc[i]!=0)
?? ??? ?{
?? ??? ??? ?for(j=0;j<SIZE;j++)
?? ??? ??? ?{
?? ??? ??? ??? ?k=0;
?? ??? ??? ??? ?while(tr[j][k] == ' ')
?? ??? ??? ??? ??? ?k++;
?? ??? ??? ??? ?if(asc[i] == tr[j][k])//asc放的是首字母,要找到tr字符串的首字母和它比较?
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?printf("tr[%d]:%s\n",j,tr[j]);
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?else
?? ??? ??? ??? ??? ?continue;
?? ??? ??? ?}
?? ??? ?}
?? ?}
}
void c(char tr[][40])//对首长度进行冒泡排序得到新的数组后去重,让tr按照去重后的数组输出?
{
?? ?int len[SIZE]={0};
?? ?int i,j;
?? ?char *p[SIZE];
?? ?for(i=0;i<SIZE;i++)
?? ?{
?? ??? ?len[i] = strlen(tr[i]);
?? ?}
?? ?bubble_sort(len,SIZE);
?? ?repeat_zero(len);
?? ?for(i=0;i<SIZE;i++)
?? ?{
?? ??? ?if(len[i]!= 0)
?? ??? ?{
?? ??? ?for(j=0;j<SIZE;j++)
?? ??? ??? ?if(len[i] == strlen(tr[j]))
?? ??? ??? ?{?? ?
?? ??? ??? ??? ?printf("tr[%d]:%s\n",j,tr[j]);
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ??? ?continue;
?? ??? ?}
?? ?}?? ??? ?
}
void d(char tr[][40])//对单词长度进行冒泡排序得到新的数组后去重,让tr按照去重后的数组输出?
{
?? ?int len[SIZE]={0};
?? ?int i,j;
?? ?for(i=0;i<SIZE;i++)
?? ??? ?len[i]=word_len(tr[i]);
?? ?bubble_sort(len,SIZE);
?? ?repeat_zero(len);
?? ?for(i=0;i<SIZE;i++)
?? ?{
?? ??? ?if(len[i]!= 0)
?? ??? ?{
?? ??? ?for(j=0;j<SIZE;j++)
?? ??? ??? ?if(len[i] == word_len(tr[j]))
?? ??? ??? ?{?? ?
?? ??? ??? ??? ?printf("tr[%d]:%s\n",j,tr[j]);
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ??? ?continue;
?? ??? ?}
?? ?}?? ??? ?
}