将一个字符串的元音字母复制到另一个字符串,并排序,让小写在前,大写在后,分别有序

问题描述:
有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需要实现一函
数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从
小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。
说明:
1、元音字母是a,e,i,o,u,A,E,I,O,U。
2、筛选出来的元音字母,不需要剔重;
最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。
要求实现函数:
void sortVowel (char* input, char* output);
【输入】char* input,表示输入的字符串
【输出】char* output,排好序之后的元音字符串。

【返回】无

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void sort(char *letter){
	//函数将字母字符串按照从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。
	int len = strlen(letter);
	int i, j, flag1 = -1, flag2 =  - 1;
	char temp;
	char *capital = (char *)malloc(sizeof(char) * (len + 1));
	//对字符串初步排序,实现递增
	for(i =0; i < len; i++){
		for(j = i + 1; j < len; j++){
			if(letter[i] > letter[j]){
				temp = letter[i];
				letter[i] = letter[j];
				letter[j] = temp;
			}	
		}
	}
	//printf("%s\n", letter);//调试

	for(i = 0; i < len; i++){
		if(letter[i] >= 'a'){
			flag1 = i;//记下第一个小写字母的位置
			break;//找到第一个小写字母即不再向下寻找
		}
	}
	//printf("flag1 = %d\n", flag1);//调试
	if(flag1 > 0){
		//含有大写字母
		for(i = 0; i < flag1; i++){
			capital[i] = letter[i];//将大写字母赋值出来,便于后序将小写字母前移
		}
		capital[i] = '\0';
		//printf("%s\n", capital);//调试
		for(i = 0; i + flag1 < len; i++){
			letter[i] = letter[flag1 + i];//小写字母前移
			flag2 = i;//记下小写字母结束的位置
		}
		strcpy(letter + flag2 + 1, capital + '\0');//将大写字母复制进来
	}
	
	free(capital);
}
void sortVowel(char *input, char *output){
	//先取出元音字母,然后再排序
	int len = strlen(input);
	int i, j = 0;
	for(i = 0; i < len; i++){
		if((input[i] == 'a') || (input[i] == 'e') || (input[i] == 'i') || (input[i] == 'o') || (input[i] == 'u')
			|| (input[i] == 'A') || (input[i] == 'E') || (input[i] == 'I') || (input[i] == 'O')  || (input[i] == 'U')){
				output[j] = input[i];
				j++;
		}
	}
	output[j] = '\0';
	//printf("%s\n", output);//调试
	sort(output);

}
void main(){
	char input[100];
	char output[100];
	strcpy(input, "Abort!May Be Some Errors In Out System.");
	printf("%s\n", input);
	sortVowel(input, output);
	printf("%s\n", output);
	getchar();
}

【出错记录】忘记break语句,导致flag1错误。

【小结】以后寻找第一个符合条件的位置时,找到后一定要break。否则找到的是最后一个符合条件的位置。

二、刚才又把算法改进了一下,下面贴出第二个方法。思路:先取出小写元音字母,再取出大写元音字母,然后分别对两个字符段排序。因为不是字符串,所以要记录下小写元音字母和大写元音字母的结束位置,便于后续分别排序。实现函数 void bubblesort(char *letter, int offindex);分别对两个字符段排序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void bubbleSort(char *letter, int offindex){
	//offindex是指字符串最后一个字符的下标
	int i, j;
	char temp;
	for(i = 0; i <= offindex; i++){
		for(j = i + 1; j <= offindex; j++){
			if(letter[i] > letter[j]){
				temp = letter[i];
				letter[i] = letter[j];
				letter[j] = temp;
			}
		}
	}
}
void sortVowel(char *input, char *output){
	//先取出元音字母,然后再排序
	int len = strlen(input);
	int i, j = 0;
	int flag1 = -1, flag2 = -1;//分别记下小写字母的结束位置
	for(i = 0; i < len; i++){
		if((input[i] == 'a') || (input[i] == 'e') || (input[i] == 'i') || (input[i] == 'o') || (input[i] == 'u')){
			//先取出小写的元音字母
			output[j] = input[i];
			flag1 = j;//记下小写字母结束的下标
			j++;
		}
	}
	for(i = 0; i < len; i++){
		if((input[i] == 'A') || (input[i] == 'E') || (input[i] == 'I') || (input[i] == 'O')  || (input[i] == 'U')){
			//取出大写的元音字母,并放在小写元音字母的后面
			output[j] = input[i];
			flag2 = j;
			j++;
		}
	}
	//分别对大小写字母排序
	if(flag1 >= 0){
		bubbleSort(output, flag1);
	}
	if(flag2 >= 0){
		bubbleSort(output + flag1 + 1, flag2 - flag1 - 1);
	}
	output[j] = '\0';
	printf("%s\n", output);//调试	
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值