//2 字符串处理转换 //问题描述: //在给定字符串中找出单词( “单词”由大写字母和小写字母字符构成, //其他非字母字符视为单词的间隔,如空格、问号、数字等等;另外单个字母不算单词); //找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列), //然后输出到一个新的字符串中;如果某个单词重复出现多次,则只输出一次; //如果整个输入的字符串中没有找到单词,请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。 //要求实现函数: //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<assert.h> void my_word(char input[ ], char output[ ]) { assert(input); assert(output); int flag = 1;//一个标识,为1表示遇到了非字母的字符 int i = 0; //作为扫描字符串的标识 int newp = 0; //作为存放调整后字符串的标识 //把字符串进行扫描,变成英语的句式 “(单词1)_(单词2)+(单词3)” 中间的间隔式非字母字符 while(input[i] != '\0') //此处i作为一个扫描指针,newp作为一个调整后的指针,存放符合要求的字符 { if(( (input[i] < 'A' )||(input[i] > 'Z'&&input[i]<'a') || ( input[i] >'z'))&& (flag == 1) )//之前遇到了非字母,现在遇到的是非字母 { i++; } else if(((input[i] >= 'a' && input[i] <= 'z') || (input[i] >='A'&& input[i] <='Z'))&& (flag == 1) )//之前遇到了非字母,现在遇到的是字母 { input[newp++] = input[i++] ; flag = 0; } else if ( ((input[i] >= 'a' && input[i] <= 'z') || (input[i] >='A'&& input[i] <='Z'))&& (flag == 0) )//之前遇到了字母,现在遇到的是字母 { input[newp++] = input[i++]; } else //之前遇到了字母,现在遇到的是非字母 { input[newp++] = input[i++] ; flag = 1; } } input[newp] = '\0'; printf("%s\n",input); //输出调整后的字符 int NumOfNotchar = 0 ;//统计出字符串中的单词数,NumOfNotchar+1 i = 0; while(input[i] != '\0' ) { if( (input[i] < 'A' )||(input[i] > 'Z'&&input[i]<'a') || ( input[i] >'z')) //通过非字母的个数来判断调整后单词的个数 NumOfNotchar++; i++; } newp = 0; int lastpos = 0; //存放之前字符串中最长单词的长度的位置 int lastlength = 0; //存放之前字符串中最长单词的长度 for(int n = 0; n < NumOfNotchar ; n++ ) // { i = 0; int maxlength = 0; //存放当前字符串中最长单词的长度 int length = 0; //记录单词的长度 int maxpos = 0;//存放当前字符串中最长单词的长度的位置 int flag2 = 0; //作为一个标识,判断当前单词与上一个单词是否一样 //当前字符串中的最个数 int Numofinput = 0; while(input[i] != '\0' ) { Numofinput++; i++; } i = 0; //作为扫描字符串的指针 int prepos = Numofinput; //prepos存放(再长度相同情况下最前面)最长单词的起始位置 while(i <= Numofinput ) { if( ((input[i] >= 'a' && input[i] <= 'z') || (input[i] >='A'&& input[i] <='Z')) ) //遇到的是字母 { length++; i++; continue; } else if (length >= maxlength && length!=1 ) //遇到非字母了 { i++; maxpos = i-length-1 ; //暂时存放当前最大的单词的起始位置 if( length > maxlength) //除非你比最大的长度还大,否则不改变prepos起始位置,prepos存放(再长度相同情况下最前面)最长单词的起始位置 { prepos = maxpos; } maxlength = length; length = 0; if( maxlength == lastlength ) //如果当前的最长字符和之前的字符等长,判断是否相等 { for(int j = 0; j<maxlength; j++) { if(input[(prepos+j)] == output[(lastpos+j)]) { ; } else //说明当前字符和之前的字符是不相等的 break; } if (j == (maxlength )) //说明当前字符和之前的字符是相等的 flag2 = 1; continue; } } else //遇到非字母了,但是之前的单词没有maxlength长 { i++; length = 0; } } if( flag2 != 1 ) //如果当前字符和之前的字符是不相等,就将这个字符放入output中 { int j = newp; lastpos = newp; lastlength = maxlength; for(j =prepos; j < (prepos+maxlength); j++ ) { output[newp++] = input[j]; } output[newp++] = ' '; } //把这个单词去掉 int start = prepos; int end = prepos + maxlength; if(input[ end]== '\0') //如果只剩下一个空字符串了 { input[ start] = input[end]; input[start-1]='\0'; } else //把当前后面的到结尾全部往前移 { start--; while(input[ end]!= '\0') { input[ start++] = input[end++]; } input[start]='\0'; } } output[newp] = '\0'; printf("%s\n",output); } int main() { char input[] = "some local buses, some1234123drivers max max"; char output[1000]; printf("%s\n",input); my_word(input, output); return 0; }