鱼C论坛

 找回密码
 立即注册
查看: 1608|回复: 1

字符串的展开

[复制链接]
发表于 2021-11-6 14:14:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简
写,输出时,用连续递增的字母或数字串替代其中的’-’.
即“d-h”输出为“defgh”
“4-8”输出为“45678"
现在编写一个函数并在主函数调用能够实现以下逻辑:
遇到以下情况需要做字符串的展开:
在输入的字符串中,出现了减号“-”,且减号两侧同为小写字母或同为数字。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-11-7 01:00:32 | 显示全部楼层
本帖最后由 jackz007 于 2021-11-7 02:04 编辑

        这个代码太烧脑了!
#include <stdio.h>

bool alpha(char c)
{
        return (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') ;
}

bool upper(char c)
{
        return c >= 'A' && c <= 'Z'                             ;
}

bool lower(char c)
{
        return c >= 'a' && c <= 'z'                             ;
}

bool digit(char c)
{
        return c >= '0' && c <= '9'                             ;
}

bool check(char s[])
{
        int m                                                   ;
        bool r = false                                          ;
        for(m = 0 ; s[m] && m < 3 ; m ++)                       ;
        if(m > 2 && s[1] == '-') {
                if((alpha(s[0]) && alpha(s[2])) || (digit(s[0]) && digit(s[2]))) {
                        if((upper(s[0]) && upper(s[2])) || (lower(s[0]) && lower(s[2]))) {
                                r = true                        ;
                        } else if(digit(s[0]) && digit(s[2])) {
                                r = true                        ;
                        }
                }
        }
        return r                                                ; 
}

char * expand(char s[])
{
        int c , d , e , i , k , m  , n                                                                ;
        bool f                                                                                        ;
        for(m = 0 ; s[m] ; m ++)                                                                      ;
        for(n = m , f = false , i = 0 ; i < n - 2 ; i ++) {
                if(check(& s[i])) {
                        e = (s[i + 2] > s[i]) ? s[i + 2] - s[i] + 1 : s[i] - s[i + 2] + 1             ;
                        if(e > 3) { 
                                for(k = 0 ; k < n - i - 1 ; k ++) s[n - 1 + e - 3 - k] = s[n - 1 - k] ;
                                n += e - 3                                                            ;
                        } else if(e < 3) {
                                for(k = 0 ; k < n - i - 1 ; k ++) s[i + (e - 1) + k] = s[i + 2 + k]   ;
                                n -= 3 - e                                                            ;
                        }
                        if(e > 2) {
                                d = (s[i + 2] > s[i]) ? 1 : -1                                        ;
                                for(c = s[i] , k = 0 ; k < e ; c += d , k ++) s[i + k] = c            ;
                        }
                        i += e - 1                                                                    ;
                }
        }
        return s                                                                                      ;
}

int main(void)
{
        char s[256] = {0}           ;
        gets(s)                     ;
        printf("%s\n" , expand(s))  ;
}
        编译、运行实况:
D:\00.Excise\C>g++ -o x x.c

D:\00.Excise\C>x
12345K-Abcdefg-x123-9abcdef9-1
12345KJIHGFEDCBAbcdefghijklmnopqrstuvwx123456789abcdef987654321

D:\00.Excise\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 21:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表