/*
问题描述:
在给定字符串中找出单词
( “单词”由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,
如空格、问号、数字等等;另外单个字母不算单词);找到单词后,按照长度进行降序排序,
(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中;
如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,
请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。
要求实现函数:
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*()" ,
问题描述:
在给定字符串中找出单词
( “单词”由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,
如空格、问号、数字等等;另外单个字母不算单词);找到单词后,按照长度进行降序排序,
(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中;
如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,
请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。
要求实现函数:
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[]=""
这道题目很好的复习了我对于字符串处理中循环使用的知识,
还有C语言<string.h>中几个重要函数的用法
如strcat(),strcpy(),strncpy()等
*/
/*
问题描述:
在给定字符串中找出单词
( “单词”由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,
如空格、问号、数字等等;另外单个字母不算单词);找到单词后,按照长度进行降序排序,
(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中;
如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,
请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。
要求实现函数:
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[]=""
*/
void my_word(char input[], char output[])
{
//给字符串后面加空格方便后面对字符串进行分割
//注意,在使用这个函数的时候需要给input预留足够的长度,传递的必须是数组变量
//不能是字符串常量字符串常量无法修改,第二个参数可以是常量
//感觉这里最好使用strcpy复制一下可能更好,因为input可能是常量,无法修改
strcat(input," ");
//字符串的分割结果
char p[100][100];
//每个字符串的长度
int lenth[100];
//字符串个数
int word = 0;
int start = 0;
int end = 0;
int flag = 0;
int pi = 0;
int pj = 0;
int pl = 0;
int flag2 = 0;
for(int i = 0;input[i]!='\0';i++)
{
//判断是否是字符
if((input[i]>='a'&&input[i]<='z')||(input[i]>='A'&&input[i]<='Z'))
{
//判断是否为首次出现,若是则记录首次出现位置
if(flag==0)
{
start = i;
}
//计算连续出现次数
flag++;
}else//不是字符
{
//若连续出现次数大于1,若是则记录最后出现位置
if(flag>1)
{
end = i;
//cout<<start<<end<<endl;
//此时能够得出每个单词的起始位置还有每个单词的长度
//分割字符串,并复制到中间变量中
//使用字符串截取函数需注意在后面添加结束标志
char temp[100];
strncpy(temp,&input[start],end-start);
temp[end-start]= '\0';
//这里要判断是否重复
for(int j = 0;j< pi ; j++)
{
if(strcmp(p[j],temp)==0)
{
flag2 = 1;
break;
}else
{
flag2 = 0;
}
}
//若不重复则保存
if(flag2==0)
{
strcpy(p[pi],temp);
//保存单词长度数组
lenth[pi] = flag;
printf("%s\n",p[pi]);
printf("%d\n",lenth[pi]);
pi++;
}
}
//连续出现次数清零
flag = 0;
}
}
char temp[100] ;
int temp2 = 0;
//根据单词长度数组对单词数组进行排序
for(int i = 0 ;i <= pi; i++)
{
for(int j = i ;j <= pi; j++)
{
if(lenth[i]<lenth[j])
{
lenth[i] = temp2;
lenth[i] = lenth[j];
lenth[j] = temp2;
strcpy(temp,p[i]);
strcpy(p[i],p[j]);
strcpy(p[j],temp);
}
}
}
//对排好序的单词数组进行重新连接
for(int i = 0 ;i <= pi; i++)
{
//字符串连接函数
strcat(output,p[i]);
//这里需注意最后一个单词无需加空格
if(i < pi-1)
{
strcat(output," ");
}
}
}