C++ 如何生成递归函数,需要检查给定字符串中的当前字母及其旁边的字母是小写还是大写?
它应该像这样转换字符串:例如:HEloOO,应该转换为:HEloOO。由于某些原因,它不起作用,它只是无法将字母从大写转换为小写,反之亦然。如果您有任何帮助,我们将不胜感激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(
#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;
}