c++ - 回文但有香味
问题描述
所以写一个带有指针和布尔值的回文。我让它与一个单词一起工作,但后来我开始构建它来与一个句子一起工作。问题是我不确定如何在将新的修改后的句子变成小写并去掉空格以返回它是否是回文后如何保留它。它一直将回文返回为假,当我去检查为什么我看到程序忽略修改并保留原始字符串时。当我测试它时,我不能在参数上使用“&”。任何提示或承担我可以做些什么来保留新修改的字符串?
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!
推荐阅读
- ant-media-server - 如何在移动应用中添加眩晕服务器列表?
- postgresql - 是否可以使用 Metabase BI 查询 BigQuery 存储过程的输出(可能作为视图?)?
- c++ - atomic 的格式说明符是什么
C ++中的数据类型? - c# - Button.CommandBindings 中的多个命令
- typeorm - 过滤特定实体的所有请求?
- javascript - 结合关系javascript对象
- python - 如何使 tkinter 与 macOS python3 一起工作?
- react-native - React-Native:屏幕被切成两半
- docker - 如何检查 docker 中的当前/默认日志驱动程序?
- c++ - WriteFile() 函数因偏移量大而失败