请问这个问题怎么解决

问题遇到的现象和发生背景
相信经过这个学期的编程训练,大家对于字符串的操作已经掌握的相当熟练了。今天,徐老师想测试一下大家对于字符串操作的掌握情况。徐老师自己定义了1,2,3,4,55个参数分别指代不同的5种字符串操作,你需要根据传入的参数,按照徐老师的规定,对输入字符串进行格式转化。
  徐老师指定的操作如下:
  1 表示全部转化为大写字母输出,如abC 变成 ABC
  2 表示全部转换为小写字母输出,如abC变成abc
  3 表示将字符串整个逆序输出,如 abc 变成 cba
  4 表示将字符串中对应的大写字母转换为小写字母,而将其中的小写字母转化为大写字母输出,如 abC变成ABc
  5表示将全部转换为小写字母,并将其中所有的连续子串转换为对应的缩写形式输出,比如abcD 转换为a-d,其次,-至少代表1个字母,既如果是ab,则不需要转换为缩写形式。
问题相关代码,请勿粘贴截图

#include
#include
int main()
{
    int n, i;
    char str[201];
    printf("请输入操作(1 表示全部转化为大写字母输出,如abC 变成 ABC");
    printf("2 表示全部转换为小写字母输出,如abC变成abc");
    printf("3 表示将字符串整个逆序输出,如 abc 变成 cba");
    printf("4 表示将字符串中对应的大写字母转换为小写字母,而将其中的小写字母转化为大写字母输出,如 abC变成ABc");
    printf("5表示将全部转换为小写字母,并将其中所有的连续子串转换为对应的缩写形式输出,比如abcD 转换为a - d,其次, - 至少代表1个字母,既如果是ab,则不需要转换为缩写形式。)");
    scanf_s("%d", &n);
    printf("请输入字符串(<200):");
    scanf_s("%s", str);
    printf("输出结果为:");
    switch (n)
    {
    case 1:
        for (i = 0; i < strlen(str); i++)
        {
            if (str[i] >= 'A'&&str[i] <= 'Z')
            {
                printf("%c", str[i]);
            }
            else
            {
                printf("%c", str[i] - 'a' + 65);
            }
        }
        break;
    case 2:
        for (i = 0; i < strlen(str); i++)
        {
            if (str[i] >= 'A'&&str[i] <= 'Z')
            {
                printf("%c", str[i] - 'A' + 97);
            }
            else
            {
                printf("%c", str[i]);
            }
        }
        break;
    case 3:
        for (i = strlen(str) - 1; i >= 0; i--)
        {
            printf("%c",str[i]);
        }
        break;
    case 4:
        for (i = 0; i < strlen(str); i++)
        {
            if (str[i] >= 'A'&&str[i] <= 'Z')
            {
                printf("%c", str[i] - 'A' + 97);
            }
            else
            {
                printf("%c", str[i] - 'a' + 65);
            }
        }
    case 5:
        for (i = 0; i < strlen(str); i++)
        {
            if (str[i] >= 'A'&&str[i] <= 'Z')
            {
                str[i] = str[i] - 'A' + 97;
            }
        }
        int a[strlen(str)];
        memset(a, 0, sizeof(a));
        for (i = 0; i < strlen(str)-1; i++)
        {
            if (str[i] + 1 == str[i + 1])
            {
                if (i == 0)
                {
                    continue;
                }
                a[i] = 1;
            }
        }
        for (i = 0; i < strlen(str); i++)
        {
            if (a[i] == 0 || (a[i] == 1 && a[i - 1] == 0))
                printf("%c", str[i]);

            if (i >= 2 && (a[i] == 1 && a[i - 1] == 1 && a[i - 2] == 0))
            {
                printf("-");
            }
        }
    default:
        printf("输入错误");
        break;
    }
    return 0;
}
运行结果及报错内容
错误    C2131    表达式的计算结果不是常数    
错误    C3863    不可指定数组类型“int ['函数']”

不用那么复杂,我简单修改了下,你试试看。。。

 
#include <stdio.h>
#include <string.h>

int main()
{
    int n, i, j, k;
    char t;
    char str[201] = {0};

    printf("请输入操作:\n");
    printf("1 表示全部转化为大写字母输出,如abC 变成 ABC\n");
    printf("2 表示全部转换为小写字母输出,如abC变成abc\n");
    printf("3 表示将字符串整个逆序输出,如 abc 变成 cba\n");
    printf("4 表示将字符串中对应的大写字母转换为小写字母,而将其中的小写字母转化为大写字母输出,如 abC变成ABc\n");
    printf("5 表示将全部转换为小写字母,并将其中所有的连续子串转换为对应的缩写形式输出,比如abcD 转换为a - d,其次, - 至少代表1个字母,既如果是ab,则不需要转换为缩写形式。)\n");
    scanf("%d", &n);
    printf("请输入字符串(<200):");
    scanf("%s", str);
    
    int len = strlen(str);
    switch (n)
    {
    case 1:
        for (i = 0; i < len; i++)
        {
            if (str[i] >= 'a'&& str[i] <= 'z')
            {
                str[i] -= 32;
            }
        }
        break;
    case 2:
        for (i = 0; i < len; i++)
        {
            if (str[i] >= 'A'&&str[i] <= 'Z')
            {
                str[i] += 32;
            }
        }
        break;
    case 3:
        for (i = 0; i < len/2; i++)
        {
            t = str[i];
            str[i] = str[len - 1 - i];
            str[len - 1 - i] = t;
        }
        break;
    case 4:
        for (i = 0; i < len; i++)
        {
            if (str[i] >= 'A'&&str[i] <= 'Z')
            {
                str[i] += 32;
            }
            else if (str[i] >= 'a'&&str[i] <= 'z') 
            {
                str[i] -= 32;
            }
        }
        break;
    case 5:
        for (i = 0; i < len; i++)
        {
            if (str[i] >= 'A'&&str[i] <= 'Z')
            {
                str[i] += 32;
            }
        }

        for (i = 0, k = 0; i < len;) {
            str[k++] = str[i];
            for (j = i+1, t = 0; j < len; j++) {
                if (str[j] - str[i] == j - i) {
                    t++;
                } else if (t > 1) {
                    str[k++] = '-';
                    str[k++] = str[j - 1];
                    i = j;
                    t = 0;
                    break;
                } else {
                    i = j;
                    t = 0;
                    break;
                }
            }

            if (t > 1) {
                i = j;
                str[k++] = '-';
                str[k++] = str[len - 1];
            }
        }
        str[k++] = '\0';
        break;
    default:
        printf("输入错误\n");
        break;
    }
    
    printf("输入结果: %s\n", str);

    return 0;
}

img

71 行int a[strlen(str)]; 写错了,定义数组时尺寸是不能用变量的,strlen()相当于调用了函数,所以也报出了不能指定数组类型“int ['函数']”的错误。如果想要用变量定义数组长度可以把代码改成如下:

int len = str.size();
int *a = new int[len];

修改如下,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int  n, i, k, j = -1;
    char str[201], tmp[400];
    printf("请输入操作(1: 表示全部转化为大写字母输出,如abC 变成 ABC\n");
    printf("2: 表示全部转换为小写字母输出,如abC变成abc\n");
    printf("3: 表示将字符串整个逆序输出,如 abc 变成 cba\n");
    printf("4: 表示将字符串中对应的大写字母转换为小写字母,\n"
        "而将其中的小写字母转化为大写字母输出,如 abC变成ABc\n");
    printf("5: 表示将全部转换为小写字母,并将其中所有的连续子串转换为\n"
        "对应的缩写形式输出,比如abcD 转换为a - d,其次,\n"
        "- 至少代表1个字母,既如果是ab,则不需要转换为缩写形式。)\n");
    scanf_s("%d", &n);
    printf("请输入字符串(<200):");
    scanf_s("%[^\n]", str, 201);
    printf("输出结果为:");
    switch (n)
    {
    case 1:
        for (i = 0; i < (int)strlen(str); i++)
        {
            if (str[i] >= 'a' && str[i] <= 'z')
                str[i] = str[i] - 'a' + 65;
            printf("%c", str[i]);
        }
        break;
    case 2:
        for (i = 0; i < (int)strlen(str); i++)
        {
            if (str[i] >= 'A' && str[i] <= 'Z')
                str[i] = str[i] - 'A' + 97;
            printf("%c", str[i]);
        }
        break;
    case 3:
        for (i = strlen(str) - 1; i >= 0; i--)
            printf("%c", str[i]);
        break;
    case 4:
        for (i = 0; i < (int)strlen(str); i++)
        {
            if (str[i] >= 'A' && str[i] <= 'Z')
                str[i] = str[i] - 'A' + 97;
            else
                str[i] = str[i] - 'a' + 65;
            printf("%c", str[i]);
        }
        break;
    case 5:
        for (i = 0; str[i]; i++)
            if (str[i] >= 'A' && str[i] <= 'Z')
                str[i] += 32;
        for (i = 0; str[i]; i++) {
            if (i == 0)
                tmp[++j] = str[i];
            else if (str[i + 1] != '\0') {
                if (str[i] != str[i - 1] + 1 || str[i] != str[i + 1] - 1)
                    tmp[++j] = str[i];
                else if (tmp[j] != '-')
                    tmp[++j] = '-';
            }
            else
                tmp[++j] = str[i];
        }
        tmp[++j] = '\0';
        printf("%s\n%s", str, tmp);
        break;
    default:
        printf("输入错误");
        break;
    }
    return 0;
}

img



#include<stdio.h>
#include<string.h>
#define MAX 255
int lianxuzichuan(char t[],int b,int e)
{
    for(int i=b; i<e; i++)
    {
        if(t[i+1]-1!=t[i])
        {
            return 0;
        }
    }
    return 1;
}


int main()
{
    int n, i,j;
    char str[201];
    printf("请输入操作:\n1 表示全部转化为大写字母输出,如abC 变成 ABC\n");
    printf("2 表示全部转换为小写字母输出,如abC变成abc\n");
    printf("3 表示将字符串整个逆序输出,如 abc 变成 cba\n");
    printf("4 表示将字符串中对应的大写字母转换为小写字母,而将其中的小写字母转化为大写字母输出,如 abC变成ABc\n");
    printf("5 表示将全部转换为小写字母,并将其中所有的连续子串转换为对应的缩写形式输出,比如abcD 转换为a - d,其次, - 至少代表1个字母,既如果是ab,则不需要转换为缩写形式。)\n");
    scanf("%d", &n);
    printf("请输入字符串(<200):");
    scanf_s("%s", str);
    printf("输出结果为:");
    switch (n)
    {
        case 1:
            for (i = 0; i < strlen(str); i++)
            {
                if (str[i] >= 'A'&&str[i] <= 'Z')
                {
                    printf("%c", str[i]);
                }
                else
                {
                    printf("%c", str[i] - 'a' + 65);
                }
            }
            break;
        case 2:
            for (i = 0; i < strlen(str); i++)
            {
                if (str[i] >= 'A'&&str[i] <= 'Z')
                {
                    printf("%c", str[i] - 'A' + 97);
                }
                else
                {
                    printf("%c", str[i]);
                }
            }
            break;
        case 3:
            for (i = strlen(str) - 1; i >= 0; i--)
            {
                printf("%c",str[i]);
            }
            break;
        case 4:
            for (i = 0; i < strlen(str); i++)
            {
                if (str[i] >= 'A'&&str[i] <= 'Z')
                {
                    printf("%c", str[i] - 'A' + 97);
                }
                else if(str[i] >= 'a'&&str[i] <= 'z')
                {
                    printf("%c", str[i] - 'a' + 65);
                }
            }
            break;
        case 5:
        {
            for (i = 0; i < strlen(str); i++)
            {
                if ( str[i] >= 'A'&&str[i] <= 'Z' )
                {
                    str[i] = str[i] - 'A' + 97;
                }
            }
            int maxlen=0;
            int b=0,e=0;
            for (i = 0; i < strlen(str); i++)
            {
                for (j = strlen(str)-1; j >i+2; j--)
                {
                    if(lianxuzichuan(str,i,j)&&j-i>maxlen)
                    {
                        maxlen=j-i;
                        b=i,e=j;
                        //printf("%c - %c",str[i],str[j]); i=j;break;
                    }
                }
            }
            for (i = 0; i < strlen(str); i++)
            {
                if(i<=b||i>=e)
                {
                    printf("%c",str[i]);
                }
                if(i==b+1&&e-b>=2)
                {
                    printf(" - ");
                    i=e-1;
                }
            }
            break;
        }
        default:
            printf("输入错误\n");
            break;
    }
    return 0;
}