北航研究生复试2011上机第三题:显示省略

本文介绍了一种用于字符串处理的算法,该算法能够识别并展开类似'dsafas-zdfaf10'这样的字符串中的字符范围,例如'a-z',并将省略的字符全部显示出来。文章提供了完整的C语言实现代码,并通过样例展示了其功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:给定一个字符串 其中包含‘-’,如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

结果:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值