【备战2014笔面试】华为机考-在给定字符串中找出单词并排序

/*
问题描述:    
在给定字符串中找出单词
( “单词”由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,
如空格、问号、数字等等;另外单个字母不算单词);找到单词后,按照长度进行降序排序,
(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中;
如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,
请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。
要求实现函数:
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," ");
                  
             } 
     }
    
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值