确定串是否是文完成的,而无需更改输入
Determine if a string is a palindrome without changing input
我正在尝试在C 中编写一个程序,该程序将以标准CIN输入为输入,并确定输入是否为palindrome。我不能以任何方式更改字符串,也无法复制它。
代码必须包含诸如bool isPalindrome( const char* x){}
我的尝试在下面列出。
#include <cctype>
#include <iostream>
#include <string>
using namespace std;
bool isPalindrome( const char* x)
{
string str = *x;
int n = str.length();
for (int i = 0; i < n; ++i)
{
int j = 0;
while (isalpha(str[i]))
{
if (isalpha(str[n-j-1]))
{
if (tolower(str[i]) == tolower(str[n-j-1]))
return true;
else
return false;
}
j += 1;
}
}
return true;
}
int main()
{
string str;
cout << "Enter your string: ";
getline (cin, str);
const char * x ;
x = &str;
if (isPalindrome(x) == true)
{
cout << "Yes it is!" << endl;
}
else
{
cout << "No, it's not." << endl;
}
cout << str << endl;
return 0;
}
我不是最好的C 程序员,而指针的使用仍然使我有些困惑。参数 const char * x
是否意味着输入是初始化的,以指示谁的值是恒定的?任何帮助是极大的赞赏!
编辑:我忘了提到...输入可能包含标点符号,但仍然可以是回文。例如,"女士,我是亚当!"是一个回文。但是我不能从字符串中删除标点符号,因为不允许更改字符串。
尝试以这种方式:
bool isPalindrome(const string& s)
{
int a = 0;
int b = s.size()-1;
while(a<b)
{
if(s[a] != s[b]) return false;
++a;
--b;
}
return true;
}
编辑:关于您的第二个问题:
const char * x
是指向数组的指针,元素为 const
,
char * x
是一个数组的指针,
char * const x
是const
指向数组的指针,
const char * const x
是const
指向数组的指针,元素为const
edit2:看来您几乎在代码中拥有它,但是在找到单个字符匹配后,您将true
返回得太快了。但是,当您已经使用C string
时,请勿使用char *
。如果您只使用string
对象,则可以使代码更加清晰。
这是我如何跳过非alpha字符有效的方式:
bool isPalindrome(const string& s)
{
int a = -1; // points before the first character
int b = s.size(); // points after the last character
for(;;)
{
// in each iteration shift `a` and `b` at least by one
do ++a; while(a<b && !isalpha(s[a]));
do --b; while(a<b && !isalpha(s[b]));
if(a >= b) return true;
if(toupper(s[a]) != toupper(s[b])) return false;
}
}
是否高效,但可能更难制作错误(哦,但是它复制了字符串,您不想要它):
#include <algorithm>
bool badchar(char c)
{
return !isalpha(c);
}
bool isPalindrome2(const string& s)
{
string copy(s);
transform(s.begin(), s.end(), copy.begin(), ::toupper);
copy.erase(remove_if(copy.begin(), copy.end(), badchar), copy.end());
string rev = copy;
reverse(rev.begin(), rev.end());
return copy == rev;
}
我更喜欢第一种方式。
逻辑很简单。将弦与中间分开。首先比较持久,直到中间。如果字符在任何时候都不相等,那么它就不是alindindrome。
代码段(未测试):
char string[] = "level";
int length;
length = strlen(string);
for(int i = 0, j = length - 1; i < (length / 2) ; i++, j--) {
if(string[i] != string[j]) {
// Not palindrome
return false;
}
}
您在第一个字符之后立即返回,因此剩下的任何时间都不会比较
if (tolower(str[i]) == tolower(str[n-j-1]))
return true;
else
return false;
仅在有任何区别的情况下返回,否则等到所有字符都被比较
如果您使用的是C ,则使用 vector 。首先将字符串插入向量,反向向量,然后检查原始向量,而反向向量相等。如果等于相等,则否则就不会。
您不需要任何指针。简单的。:)
- 检查输入是否不是整数或数字
- C++LDAP检查用户是否是特定组的成员
- 有没有办法检查用户输入是否是数字?
- 如何知道文本文件中的输入是否是 C++ 中的有效数字
- CLion 是否支持自定义输入?如果是,我在哪里输入它们?
- 如何检查输入是否为字符并显示它是"invalid input",否则它将按原样运行
- isdigit() 和 isalnum() 给出错误,因为输入是一个常量字符并且无法转换。其他可能查看输入是否为数字的方法?
- 如何确定输入文件中的一行是否是最后一行?C++
- 查找我的算法的运行时间,以查找输入在输入方面是否是素数
- 确定串是否是文完成的,而无需更改输入
- 我正在尝试做一个循环,检查输入是否是一个数字,如果没有再次询问
- 有没有一种方法可以测试一个输入是否是C++中的数字
- 如何检查输入是否是没有任何其他字符的有效整数
- 我如何创建一个循环来检查用户的输入,看看它是否是一个现有的文件
- 如何检查输入是否是int型
- c++检查输入是否是数字
- 如何检查输入是否是数组中的元素
- c++:检查输入是否是数字
- 我如何检查输入是否是一个int在c++
- 检查整个输入是否是浮点数