如何解决回文但有香味
所以用指针和布尔值写一个回文。我让它使用一个单词,但后来我开始构建它以使用一个句子。问题是我不确定在将新修改的句子变成小写并去掉空格后如何保留它以返回它是否是回文。它一直将回文返回为假,当我去检查为什么我看到程序忽略修改并保留原始字符串时。当我测试它时,我不能在参数上使用“&”。关于我可以做些什么来保留新修改的字符串的任何提示或看法?
int main()
{
userInput();
return 0;
}
void userInput()
{
char str[90];
std::cout<<"Please enter a string to check if it is a palindrome: ";
std::cin.getline(str,90);
modifyString(str);
}
void modifyString(char *string)
{
int count = 0;
for (int i=0; i<strlen(string); i++)
{
putchar(tolower(string[i]));
}
for (int i = 0; string[i]; i++)
{
if (string[i] != ' ')
{
string[count++] = string[i];
}
}
string[count] = '\0';
std::cout<<string<<std::endl;
results(string);
}
bool checkPalindrome(char *string)
{
char *begin;
char *end;
begin = string;
end = (string + strlen(string)-1);
while(begin != end)
{
if ((*begin) == (*end))
{
begin ++;
end--;
}
else
{
return false;
}
}
return true;
}
void results(char *string)
{
bool isItPalindrome;
isItPalindrome = checkPalindrome(string);
if( isItPalindrome == true)
{
std::cout<<"\nCongrats,the string is a palindrome!";
}
else
{
std::cout<<"\nThis string is not a palindrome.";
}
}
解决方法
对于初学者来说,main 的定义
int main()
{
userInput();
return 0;
}
没有意义。根据函数名main
,函数应该执行的主要任务是输出输入的句子是否为回文。
这个for循环
for (int i=0; i<strlen(string); i++)
{
putchar(tolower(string[i]));
}
没有任何用处。它只是输出小写的字符串。
本声明
end = (string + strlen(string)-1);
如果传递的是空字符串,则可以调用未定义的行为。
这个while循环
while(begin != end)
{
if ((*begin) == (*end))
{
begin ++;
end--;
}
else
{
return false;
}
}
还可以为包含偶数个 ofo 字符的字符串调用未定义行为,因为在此 if 语句之后
if ((*begin) == (*end))
{
begin ++;
end--;
}
如果相邻的两个字符相等,则递增后的 begin
将大于递减后的 end
。因此,循环将继续迭代。
通常,更改原始字符串的方法只是一种糟糕的方法。 你的程序有太多的功能。编写一个函数来判断传入的字符串是否为回文就足够了。
这是一个演示程序。
#include <iostream>
#include <cstring>
#include <cctype>
bool checkPalindrome( const char *s )
{
const char *t = s + std::strlen( s );
do
{
while ( s != t && std::isspace( ( unsigned char )*s ) ) ++ s;
while ( s != t && std::isspace( ( unsigned char )*--t ) );
} while ( s != t &&
std::tolower( ( unsigned char )*s ) == tolower( ( unsigned char ) *t ) &&
++s != t );
return s == t;
}
int main()
{
const size_t N = 100;
char s[N] = "";
std::cout << "Please enter a string to check if it is a palindrome: ";
std::cin.getline( s,N );
std::cout << '\n';
if ( checkPalindrome( s ) )
{
std::cout << "Congrats,the string is a palindrome!\n";
}
else
{
std::cout << "This string is not a palindrome.\n";
}
return 0;
}
它的输出可能看起来像
Please enter a string to check if it is a palindrome: 1 23 456 6 54 321
Congrats,the string is a palindrome!
,
好的,我解决了!
这里的一位用户提出了一个观点,即我的小写字母没有修改字符串,只是将其打印出来。我尽力解决这个问题,我想我找到了解决方案,一切正常。如果您想查看它的外观,请评论以调试它,但我所做的是再次为小写字母创建一个 for 循环,但使用它创建了另一个指针。这是它的外观。
for (char *pt = string; *pt != '\0'; ++pt)
{
*pt = std::tolower(*pt);
++pt;
}
现在肯定会将字符串更改为小写并保持小写。
所以现在修改后的函数看起来像这样,并准备好接受你给它的任何句子回文。示例:一罐 tUNa 的 nUt。我们将其全部设为小写,然后取出空格和回文并返回 true。
void modifyString(char *string)
{
int count = 0;
for (char *pt = string; *pt != '\0'; ++pt)
{
*pt = std::tolower(*pt);
++pt;
}
for (int i = 0; string[i]; i++)
{
if (string[i] != ' ')
{
string[count++] = string[i];
}
}
string[count] = '\0';
//take out the forward slash below to see how it looks after being modified
// std::cout<<std::endl<<string<<std::endl;
results(string);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。