问题描述:
在给定字符串中找出单词( “单词”由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,如空格、问号、数字等等;另外单个字母不算单词);找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),
然后输出到一个新的字符串中;如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,请输出空串。
输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。
要求实现函数:
void my_word(charinput[], char output[])
【输入】 char input[], 输入的字符串
【输出】 char output[],输出的字符串
【返回】 无
示例
输入:charinput[]="some local buses, some1234123drivers" ,
输出:charoutput[]="drivers local buses some"
输入:charinput[]="%A^123 t 3453i*()" ,
输出:charoutput[]=""
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#define N 20
#define M 100
char *word[N]; //这儿必须设置为指针数组,才便于后面按长度冒泡排序!!
bool iszimu (char s) //用于判断一个字符是否为字符
{
if((s>='a'&&s<='z')||(s>='A'&&s<='Z'))
return true;
return false;
}
bool issame(char s[],int j) //用于判读重复单词
{
for(int i=0;i<j;i++)
if(i!=j &&strcmp(s,word[i])==0)
return 1;
return 0;
}
void my_word(char input[], char output[])
{
assert(input!=NULL);
int i=0,j=0,num=0;
for(i=0;i<N;i++) //指针数组必须为每个数组元素分配内存(指向字符窜) 如果用二维字符数组,则不需要分配内存!!
word[i]=(char *)malloc(M*sizeof(char));
char *p=input;
char temp[2]; //用于保存一个字母
char *swp; //交换临时变量
bool flag=false; //用于断单词
bool first=true; //用于复制第一个字母
while(*p)
{
if(iszimu(*p))
{
temp[0]=*p;
temp[1]='\0';
if(first)
{
strcpy(word[num],temp); //先复制
first=false;
}
else
strcat(word[num],temp); //再连接
if(!iszimu(*(p+1)))
flag=true;
}
if(flag) //遇到第一个非字母字符,则开始存储下一个单词
{
// puts(word[num]);
num++;
flag=false;
first=true;
}
p++;
}
for(i=1;i<num;i++) //对保存的单词组按长度非递增进行冒泡排序
for(j=0;j<num-i;j++)
if(strlen(word[j])<strlen(word[j+1]))
{
swp=word[j];
word[j]=word[j+1];
word[j+1]=swp;
}
if(strlen(word[0])!=1) //输出第一个单词
strcpy(output,word[0]);
else
strcpy(output,""); //如果第一个单词长度都为1,则输出空
for(i=1;i<num;i++)
if(strlen(word[i])!=1 && !issame(word[i],i))//降序输出其余单词
{
strcat(output," ");
strcat(output,word[i]);
}
}
void main()
{
// char input[100]="some local buses, some1234123drivers";
// char input[100]="%A^123 t 3453i*()";
char input[100]="some local buses,sdf,rgfg 23 4 fdfd 35fgf io some1234123drivers";
// char input[100];
char output[100];
// gets(input);
my_word(input,output);
puts(output);
}