首页 > 解决方案 > C使用递归函数返回字符

问题描述

我正在尝试创建一个获取 char 数组的函数,如果数组中的元素是字母和小写,它将元素更改为大写,反之亦然。

我调试了代码,它似乎可以工作,我唯一的问题是我不知道如何重建 char 数组,因为每次我返回一个 char 并且它假设创建一个 char 数组,据我了解。

有人可以告诉我我做错了什么吗?

char reverseLetter(char str[])
{
    char temp;
    if (strlen(str) == 0)
        return 0;
    if (str[strlen(str) - 1] >= 'A' && str[strlen(str) - 1] <= 'Z')
    {
        temp = tolower(str[strlen(str) - 1]);
        str[strlen(str) - 1] = '\0';
        return reverseLetter(str) + temp;
    }
    else if (str[strlen(str) - 1] >= 'a' && str[strlen(str) - 1] <= 'z')
    {
        temp = toupper(str[strlen(str) - 1]);
        str[strlen(str) - 1] = '\0';
        return reverseLetter(str) + temp;
    }
    else
    {
        str[strlen(str) - 1] = '\0';
        return reverseLetter(str);
    }
}

void main()
{
    char str[4] = { 'a', 'b', 'C', '\0' };
    printf("%c", reverseLetter(str));
}

编辑:我认为我需要返回每个字符显然这不是你想要做的,你需要更改数组中的元素并返回数组。

标签: crecursion

解决方案


您可以让用户创建一个新字符串,并将其作为参数提供给您:

char reverseLetter(char *dest, char const *source)
{
    while (*source)
    {
        if (*source <= 'z' && *source >= 'a')
            *dest = *source - 'a' + 'A';
        else if (*source <= 'Z' && *source >= 'A')
            *dest = *source - 'A' + 'a';
        else
            *dest = *source;
        ++dest;
        ++source;
    }
    *dest = '\0';
}

int main(void)
{
    char src[] = "abC09";
    char dst[6];

    reverseLetter(dst, src);

    printf("%s --> %s\n", src, dst);

    return 0;
}

请注意,source具有限定符const,因此用户知道您不会修改源字符串。

如果您绝对希望它是递归的:

char reverseLetter(char *dest, char const *source)
{
    if (*source <= 'z' && *source >= 'a')
        *dest = *source - 'a' + 'A';
    else if (*source <= 'Z' && *source >= 'A')
        *dest = *source - 'A' + 'a';
    else
        *dest = *source;
    if (*source)
        reverseLetter(dest+1, source+1);
}

推荐阅读