本题所采用的思想并不复杂,只是情况较多,尤其是注意字符串的开始和结尾都是'-'的情况

#include <iostream>
using namespace std;
#include <ctype.h>

void Print_Char(char left, char right, int p1, int p2, int p3)
{
    //如果减号右边的字符恰好是左边字符的后继,只删除中间的减号
    if(right-left == 1) printf("");
    else if(right <= left) printf("-");
    else
    {
        char temp;
        //正序输出
        if(1 == p3)
        {
            for(temp = left+1; temp < right; temp++)
            {
                for(int i = 0; i < p2; i++)
                {
                    if(1 == p1) printf("%c", tolower(temp));
                    else if(2 == p1) printf("%c", toupper(temp));
                    else if(3 == p1) printf("*");
                }
            }
        }
        else if(2 == p3) //逆序输出
        {
            for(temp = right-1; temp > left; temp--)
            {
                for(int i = 0; i < p2; i++)
                {
                    if(1 == p1) printf("%c", tolower(temp));
                    else if(2 == p1) printf("%c", toupper(temp));
                    else if(3 == p1) printf("*");
                }
            }
        }
    }
}

int main(void)
{
    char str[105];
    int p1, p2, p3;
    scanf("%d%d%d", &p1, &p2, &p3);
    scanf("%s", str);
    int i, j;

    //排除开头都是-的情况
    for(j = 0; str[j] != '\0'; j++)
    {
        if(str[j] == '-') printf("-");
        else break;
    }

    //遍历字符串
    for(i = j; str[i] != '\0'; i++)
    {
        if(str[i] != '-')
            printf("%c", str[i]);
        else if(str[i] == '-' && str[i+1] == '\0') //如果最后一项是-,则输出-
            printf("-");
        else if(abs(str[i+1]-str[i-1]) > 26)
            printf("-");
        else
            Print_Char(str[i-1], str[i+1], p1, p2, p3);
    }
    return 0;
}