首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何制作递归函数,它需要检查在给定的字符串中当前字母和它旁边的字母是小写还是大写?

如何制作递归函数,它需要检查在给定的字符串中当前字母和它旁边的字母是小写还是大写?
EN

Stack Overflow用户
提问于 2017-01-04 22:54:29
回答 3查看 965关注 0票数 0

它应该转换如下字符串:示例:HEloOO,应该转换为:heLOoo。由于某些原因,它不工作,它只是不会把字母从大写到小写,反之亦然,任何帮助将不胜感激?

代码语言:javascript
复制
#include <stdio.h>
#include <string.h>
#include <ctype.h>

void rek(char array[], int d)
{
    int counter=0;

    if(d==0)
    {
        printf("%s \n",array);
        printf("%d \n",counter);
    }
    else
    {
        if((array[d]>='A' && array[d]<='Z')&&(array[d-1]>='A' && array[d-1]<='Z'))
        {
            array[d]=array[d]+32;
            array[d-1]=array[d-1]+32;
            counter++;
            rek(array,d-2);
        }
        if((array[d]>='a' && array[d]<='z')&&(array[d-1]>='a' && array[d-1]<='z'))
        {
            array[d]=array[d]-32;
            array[d-1]=array[d-1]-32;
            counter++;
            rek(array,d-2);
        }
    }
}

int main()
{
    char array[100];
    int d;

    gets(array);
    d=strlen(array);

    rek(array,d);

    return 0;
}
EN

回答 3

Stack Overflow用户

发布于 2017-01-04 23:15:28

当两个相邻的字符有不同的情况时,您的函数不会调用自己。此外,当字符串从开始处理或结束处理时,您可以得到不同的结果。

我将按照以下方式编写该函数

代码语言:javascript
复制
#include <stdio.h>
#include <ctype.h>

char * rek(char *s)
{
    if (s[0] && s[1])
    {
        size_t i = 1;
        if (islower((unsigned char)s[0]) && islower((unsigned char)s[1]))
        {
            s[0] = toupper((unsigned char)s[0]);
            s[1] = toupper((unsigned char)s[1]);
            ++i;
        }
        else if (isupper((unsigned char)s[0]) && isupper((unsigned char)s[1]))
        {
            s[0] = tolower((unsigned char)s[0]);
            s[1] = tolower((unsigned char)s[1]);
            ++i;
        }

        rek(s + i);
    }

    return s;
}

int main( void )
{
    char s[] = "HEloOO";

    puts(rek(s));

    return 0;
}

程序输出是

代码语言:javascript
复制
heLOoo
票数 1
EN

Stack Overflow用户

发布于 2017-01-04 23:14:55

主要的问题是,只有当你有一对大写或小写字母时,你才会重新出现。否则,您将放下的末尾(如果是),返回到调用程序,然后停止转换。

最初的问题是,您已经用长度索引了字符串。一个包含6个字符的字符串具有0-5的索引,但是您已经开始使用位置5和6 --最后的'O‘和空字符。

结果是检查'O‘和'\0';后者根本不是字母顺序,所以您不做任何操作就跳过所有逻辑,返回到主程序,然后完成。

作为以后的参考,下面是我使用的调试工具。还可以看到规范的SO 调试帮助

代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
#include<ctype.h>
void rek(char array[], int d)
{
    int counter=0;

    printf("ENTER rek %s %d\n", array, d);

    if(d==0)
    {
        printf("%s \n",array);
        printf("%d \n",counter);
    }
    else
    {
        printf("TRACE 1: %d %c%c\n", d, array[d-1], array[d]);
        if((array[d]>='A' && array[d]<='Z')&&(array[d-1]>='A' && array[d-1]<='Z'))
        {
            printf("TRACE 2: upper case");
            array[d]=array[d]+32;
            array[d-1]=array[d-1]+32;
            counter++;
            rek(array,d-2);
        }
        if((array[d]>='a' && array[d]<='z')&&(array[d-1]>='a' && array[d-1]<='z'))
        {
            printf("TRACE 3: lower case");
            array[d]=array[d]-32;
            array[d-1]=array[d-1]-32;
            counter++;
            rek(array,d-2);
        }
    }
}
int main()
{
    char *array;
    int d;

    array = "HEloOO";
    d=strlen(array);

    rek(array,d);
    printf("%s\n", array);

    return 0;
}
票数 0
EN

Stack Overflow用户

发布于 2017-01-04 23:53:03

我想出了一个肮脏的解决方案:

代码语言:javascript
复制
#include <iostream>
#include <string>
#include <cctype>

using namespace std;

string solve(const string& str)
{
    if (str.empty()) {
        return "";
    }
    if (str.front() >= 'a' && str.front() <= 'z') {
        return (char)toupper(str.front()) + solve(str.substr(1));
    }
    if (str.front() >= 'A' && str.front() <= 'Z') {
        return (char)tolower(str.front()) + solve(str.substr(1));
    }
}

int main()
{
    string str;
    cin >> str;
    cout << solve(str) << endl;
    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41474602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档