Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何生成递归函数,需要检查给定字符串中的当前字母及其旁边的字母是小写还是大写?_C++_C_Recursion_Uppercase_Lowercase - Fatal编程技术网

C++ 如何生成递归函数,需要检查给定字符串中的当前字母及其旁边的字母是小写还是大写?

C++ 如何生成递归函数,需要检查给定字符串中的当前字母及其旁边的字母是小写还是大写?,c++,c,recursion,uppercase,lowercase,C++,C,Recursion,Uppercase,Lowercase,它应该像这样转换字符串:例如:HEloOO,应该转换为:HEloOO。由于某些原因,它不起作用,它只是无法将字母从大写转换为小写,反之亦然。如果您有任何帮助,我们将不胜感激 #include <stdio.h> #include <string.h> #include <ctype.h> void rek(char array[], int d) { int counter=0; if(d==0) { printf(

它应该像这样转换字符串:例如:HEloOO,应该转换为:HEloOO。由于某些原因,它不起作用,它只是无法将字母从大写转换为小写,反之亦然。如果您有任何帮助,我们将不胜感激

#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;
}
#包括
#包括
#包括
void rek(字符数组[],int d)
{
int计数器=0;
如果(d==0)
{
printf(“%s\n”,数组);
printf(“%d\n”,计数器);
}
其他的
{
if((array[d]>='A'&&array[d]='A'&&array[d-1]='A'&&array[d]='A'&&array[d-1]主要问题是,只有当您有一对大写或小写字母时才会重复。否则,您将退出if的末尾,返回调用程序,并停止转换

最初的问题是,您已使用长度为字符串编制索引。一个包含6个字符的字符串的索引为0-5,但您已从位置5和6开始—最后的“O”和空字符

结果是您选中了“O”和“\0”;后者根本不是字母顺序,因此您可以在不做任何操作的情况下遍历所有逻辑,返回主程序,然后完成

作为将来的参考,这里是我使用的调试工具。另请参阅规范SO

#包括
#包括
#包括
void rek(字符数组[],int d)
{
int计数器=0;
printf(“输入rek%s%d\n”,数组,d);
如果(d==0)
{
printf(“%s\n”,数组);
printf(“%d\n”,计数器);
}
其他的
{
printf(“跟踪1:%d%c%c\n”,d,数组[d-1],数组[d]);

如果((array[d]>='A'&&array[d]='A'&&array[d-1]='A'&&array[d]='A'&&array[d-1]当两个相邻字符的大小写不同时,函数不会调用自身。此外,当从开始或从结束处理字符串时,也会得到不同的结果

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

#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;
}

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

#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;
}
#包括
#包括
#包括
使用名称空间std;
字符串求解(常量字符串和str)
{
if(str.empty()){
返回“”;
}
如果(str.front()>='a'&&str.front()='a'&&str.front()>str;

这可能不是问题,但标准C或标准C++中没有任何东西需要<代码>数组[d] > =“a”& &数组[d]使用<代码> Prtff<代码>来显示<代码> d>代码>的值,<代码>数组[d] < />代码>和数组[D1]
rek
函数的开头,问题应该是显而易见的。还要注意的是,如果
d
是奇数,你会遇到一个问题,因为在这种情况下递归调用永远不会到达
0
。我不知道错误在哪里,是在递归调用中吗?如果{d}这是奇数吗?这又是一个“它不起作用”还不够的问题。请提供一些输入值、您的预期输出和程序的实际输出。否则人们只会猜测(您的家庭作业是什么?)非常感谢各位朋友的大力帮助不客气。记住接受你最喜欢的答案,并对有用的评论进行投票。为什么要使用魔法数字32?也许
array[d]=array[d]+32;
-->-->
array[d]=array[d]+('a'-'a');
哪个自我文档记录了更多的意图。要从上到下转换,代码可以使用
array[d]^='a'&'a';
适用于ASCII和EBCDIC。当然
tolower()
是相当标准的。很好的观点——但请将注释移到主体。在这里,它不会得到应有的注意。
heLOoo
#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;
}