字符串处理转换

2014-11-23 22:25:55 ? 作者: ? 浏览: 3
//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
#include
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 
 

-->

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: