题目大意:给定一个字符串 其中包含‘-’,如dsafas-zdfaf10,将s-z中省略的字符全部显示出来:dsafastuvwxyzdfaf10,程序只考虑a-z, A-Z, 0-9。且a-S, 0-r之类的不进行扩展。原样输出。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 1000
void GetNewStr(char* str, int len); //输出新的字符串
bool Judge(char a, char b); //判断'-' 前后是否一致 如a-b 0-8 G-M返回true
void strcpy_part(char* newstr, int &k1, char* str, int k2, int n); //从str[k2]开始将n个字符复制到newstr[k1]起始处
void addNewPart(char* str, int &k, char begin, char end); //在str[k]开始将begin---end闭区间的字符添加到str中
int main(){
char str[MAXSIZE];
while(scanf("%s", str) != EOF){
int len = strlen(str);
GetNewStr(str,len);
}
return 0;
}
void GetNewStr(char* str, int len){
char begin,end;
char newstr[MAXSIZE] = {'0'};
strcpy(newstr,str);
int i,k,count;
k = count = 0; //k 记录新字符串的赋值位置, count记录旧字符串要复制的起始位置
for(i = 0; i < len; i++){
if(str[i] == '-'){
begin = str[i - 1]; //记录起始字符 '* - #'中的*
end = str[i + 1]; //记录终止字符 '* - #'中的#
if(Judge(begin,end)){
strcpy_part(newstr, k, str, count, i - count - 1); //复制'*-*'前面的字符到新串
count = i + 1;
addNewPart(newstr,k,begin,end); //在新串中添加'*-*'闭区间的字符
}
}
}
strcpy_part(newstr,k,str, count, len - count); //最后尾段的复制
printf("%s\n", newstr);
}
bool Judge(char a, char b){
if(a >= 'a' && a <= 'z'){
if(b > a && b <= 'z')
return true;
}else if(a >= 'A' && a <= 'Z'){
if(b > a && b <= 'Z')
return true;
}else if(a >= '0' && a <= '9'){
if(b > a && b <= '9')
return true;
}
return false;
}
void strcpy_part(char* newstr, int &k1, char* str, int k2, int n){
for(int i = 0; i < n; i++)
newstr[k1++] = str[k2++];
}
void addNewPart(char* str, int &k, char begin, char end){
for(; begin <= end; begin++){
str[k++] = begin;
}
--k;
}
样例:
ADEa-g-m02
cdeT-bcd
ADEa-gjkalsdjgna-m023401-7
cdeT-bcda-g23401-7
结果: