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