题目:
描述
编写一个程序,将输入字符串中的字符按如下规则排序。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
注意有多组测试数据,即输入有多行,每一行单独处理(换行符隔开的表示不同行)
输入描述:
输入字符串
输出描述:
输出字符串
示例1
输入:
A Famous Saying: Much Ado About Nothing (2012/8).
复制输出:
A aaAAbc dFgghh: iimM nNn oooos Sttuuuy (2012/8).
复制
结果:
解题思路:
1,获取一行所有数据记录到str
2,创建一个和一行字符长度相同的数组,用于存放输出的数组。
3,从字母A还是循环数组str,当str为符号的时候不做判断继续循环,当str中的数组要么是A要么是a就录入out表。
4,录入out标中的时候先确定out表的下表index处是否正好是符号,从而保证符号所在位置不变。
5,退出循环的两个条件,1,26个字母判断完;2,index存完了。
6,当是第一个情况出来的时候,有可能后面还有字符没有存到out标中。因此需要循环复制str表最后的部分到out中。
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {
char str[1024] = {};
int count;
while(gets(str) != NULL) {
int len = strlen(str);
int index = 0;
char *out = (char *)malloc(sizeof(char) * (len + 1));
for(int i = 0; i < 26; i++) {
for(int j = 0; j < len; j++) {
if(str[j] < 'A' || (str[j] > 'Z' && str[j] < 'a') || str[j] > 'z') continue;
if(str[j] == 'A' + i || str[j] == 'a' + i) {
while(str[index] < 'A' || (str[index] > 'Z' && str[index] < 'a') || str[index] > 'z'){
out[index] = str[index];
index++;
}
out[index++] = str[j];
}
if(index == len) break;
}
if(index == len) break;
}
while(index < len) {
out[index] = str[index];
index++;
}
printf("%s\n", out);
free(out);
}
return 0;
}