输出: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," "); } } }