題目大意:給定一個字符串 其中包含‘-’,如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
結果: