H面试程序(28):字符串处理转换

来源:互联网 发布:原盘播放软件 编辑:程序博客网 时间:2024/04/29 00:09

 

 

//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+1i = 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;}

原创粉丝点击