我制作了一个程序来查找输入的字符串是否是回文序列,但它总是说它不是回文
#include <conio.h>
#include <graphics.h>
#include <string.h>
void main(void)
{
int i,len,halflen,flag=1;
char str[50];
clrscr();
printf("Enter a string:\n");
gets(str);
len=strlen(str);
halflen=len/2;
for(i=0;i<halflen;i++)
{
if(str[i]!=str[i+halflen])
flag=0;
break;
}
if(flag)
printf("It is a Palindrome.");
else
printf("It is not a Palindrome.");
getch();
}
答案 0 :(得分:10)
您的核心比较存在缺陷:
if (str[i] != str[i+halflen])
这不是比较你认为的两个字符。
尝试在您的程序中输入“HelloHello”,它会说它是一个回文!
你需要比较这两个:
if (str[i] != str[len-i-1])
(并按照其他答案中的建议修复大括号)
答案 1 :(得分:6)
为了给你一个线索我已经做了一些更整洁的代码缩进:
for(i=0;i<halflen;i++)
{
if(str[i]!=str[i+halflen])
flag=0;
break;
}
答案 2 :(得分:4)
您还可以使用STL来检查给定字符串是否是使用函数equal
的回文结构。假设您有std::string
名为x
,则以下函数调用确定x是否为回文
equal(x.begin(), x.begin() + x.size() / 2, x.rbegin());
答案 3 :(得分:3)
在这里你想要像......
if(str[i]!=str[strlen (str) - i - 1])
{
flag = 0;
break;
}
break
需要进入if
块,否则将始终执行。在某些时候初始化flag
也是个好主意。如果允许我进行观察,即使只有一个语句,也总是将if-block和else括在大括号中;它可以为您节省几个问题。
后来 - 根据罗德里格斯先生的评论编辑如下。
答案 4 :(得分:1)
bool isAlphaNumeric(char c)
{
return (iswalpha(c) || iswdigit(c));
}
bool isPalindrome(char *str)
{
/* A man, a plan, Anal Panama!!! */
if(*str == '\0')
{
return false;
}
int len = strlen(str);
if(len <= 1) return true;
char *start = str;
char *end = start + len - 1;
while(start < end)
{
if(!isAlphaNumeric(*start))
{
*start++;
continue;
}
if(!isAlphaNumeric(*end))
{
*end--;
continue;
}
if(towlower(*start) != towlower(*end))
{
return false;
}
*start++;
*end--;
}
return true;
}
答案 5 :(得分:1)
bool isPalindrome(char* str) {
char* s = str;
char* e = str;
while(*e) e++;
--e;
while(s < e) {
if(*s != *e) return false;
++s; --e;
}
return true;
}
答案 6 :(得分:0)
这是一个较短的解决方案(C ++; C的行数相同):
bool is_p(char const * const str, ptrdiff_t n)
{
if (n < 1) return false;
auto p = str, q = str + n - 1;
while (*(p++) == *(q--))
if (p >= q)
return true;
return false;
}
答案 7 :(得分:0)
一种C
风味的解决方案:)
bool is_palindrome(const char* s) {
const char* p = s;
while (*p != '\0') ++p;
while (s < p) if (*s++ != *--p) return false;
return true;
}
答案 8 :(得分:-1)
#include <stdio.h>
#include <string.h>
int main()
{
char a[100], b[100];
printf("Enter a string to check if it is a palindrome\n");
gets(a);
strcpy(b, a);
strrev(b);
if (strcmp(a, b) == 0)
printf("The string is a palindrome.\n");
else
printf("The string isn't a palindrome.\n");
return 0;
}
答案 9 :(得分:-3)
这是一个更好的方法。
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() {
string input;
cout << "Enter your text: ";
cin >> input;
transform(input.begin(), input.end(), input.begin(), ::tolower);
if (input[0] == input[input.length()-1])
cout << "Palindrome";
else
cout << "not palinrome";
cin.ignore();
cin.get();
}