我在C中的程序是Palindrome,其功能有误。我的功能是不比较我的字符串中的2个字符。当我输入单个字符时,它会回答回文,但如果它是两个或更多,则总是不回文。
代码:
int IntStrlength=strlen(StrWord);
int IntCtr2=0;
int IntCtr=1, IntAnswer;
while(IntCtr<=(IntStrlength/2)){
printf(" %d %d\n", IntCtr2,IntStrlength);
if(StrWord[IntStrlength] != StrWord[IntCtr2]){
IntAnswer=0;
printf(" %d=Not Palindrome", IntAnswer);
exit (0);
}//if(StrWord[IntCtr2]!=StrWord[IntStrlength]) <---------
else{
IntCtr2++;
IntStrlength--;
}// else <--------
IntCtr++;
}//while(IntCtr<IntStrlength/2) <-----------
IntAnswer=1;
printf(" %d=Palindrome", IntAnswer);
return ;
}
单个字符:
两个或多个字符:
答案 0 :(得分:2)
为什么不这样写呢
int wordLength = strlen(StrWord);
for (int i=0;i<(wordLength/2);i++) {
if (StrWord[i] != StrWord[wordLength-i-1]) {
return 0;
}
}
return 1;
对于长度均匀(例如8)的单词,计数器将从0到3,访问所有字母。对于不均匀的单词(比如7),counter将从0变为2,而中间元素不受控制。这不是必要的,因为它是一个回文并且它总是匹配
答案 1 :(得分:1)
我之前在一本名为&#34; Cracking the Coding Interview&#34;的采访书中看过这个算法。
在其中,作者展示了一个非常简单易用的代码实现。代码如下:here也是解释代码的视频。
#include<stdio.h>
#include<string.h> // strlen()
void isPalindrome(char str[]);
int main(){
isPalindrome("MOM");
isPalindrome("M");
return 0;
}
void isPalindrome(char str[]){
int lm = 0;//left most index
int rm = strlen(str) - 1;//right most index
while(rm > lm){
if(str[lm++] != str[rm--]){
printf("No, %s is NOT a palindrome \n", str);
return;
}
}
printf("Yes, %s is a palindrome because the word reversed is the same \n", str);
}
答案 2 :(得分:0)
看看这段代码,就是我实现它的方式(记得#include <stdbool.h>
或者它不起作用):
for(i = 0; i < string_length; i++)
{
if(sentence[i] == sentence[string_lenght-1-i])
palindrome = true;
else
{
palindrome = false;
break;
}
}
这样做会检查你的句子是否是回文,并且在第一次出现时这不是真的,它将打破for循环。你可以使用像
这样的东西if(palindrome)
printf(..);
else
printf(..);
为用户提供简单的提示。
示例:
雷达是回文abba是回文
abcabc不是回文
请注意
这一事实由于“A”和“a”具有不同的ASCII码,阿巴
不被认为是回文:
'A'的值为65
'a'的值为97 根据{{3}}。您可以找到更多ASCII table。
您可以避免此问题将字符串的所有字符转换为小写字符。
您可以执行此操作,包括<ctype.h>
库并调用函数int tolower(int c);
,如下所示:
编辑:我做了一个简单的程序,看看它是否可以帮助你for ( ; *p; ++p) *p = tolower(*p);
或
for(int i = 0; str[i]; i++){ str[i] = tolower(str[i]); }
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <ctype.h>
void LowerCharacters(char *word, int word_lenth);
int main(void){
char *word = (char *) malloc(10);
bool palindrome = false;
if(word == 0)
{
printf("\nERROR : Out of memory.\n\n");
return 1;
}
printf("\nEnter a word to check if it is palindrome or not : ");
scanf("%s", word);
int word_length = strlen(word);
LowerCharacters(word,word_length);
for(int i = 0; i < word_length; i++)
{
if(word[i] == word[word_length-1-i])
palindrome = true;
else
{
palindrome = false;
break;
}
}
palindrome ? printf("\nThe word %s is palindrome.\n\n", word) : printf("\nThe word %s is not palindrome.\n\n", word);
free(word);
return 0;
}
void LowerCharacters(char *word, int word_length){
for(int i = 0; i < word_length; i++)
word[i] = tolower(word[i]);
}
输入:
输入一个单词以检查它是否是回文:RadaR
输出:
雷达这个词是回文。
答案 3 :(得分:0)
#include<stdio.h>
int check_palindrom(char *);
int main()
{
char s1[20];
printf("Enter the string...\n");
gets(s1);
int x;
x=check_palindrom(s1);
x?printf("Palindrom\n"):printf("Not Palindrom\n");
}
int check_palindrom(char *s)
{
int i,j;
for(i=0;s[i];i++);
for(i=i-1,j=0;i>j;i--,j++)
if(s[i]!=s[j])
return 0;
if(s[i]==s[j])
return 1;
}
输入字符串...
雷达
回文
答案 4 :(得分:0)
你可以这样做:
#include <stdio.h>
#include <string.h>
int check_palindrome(char string []);
int main()
{
char string[20];
printf("Enter the string...\n");
scanf ("%s", &string);
int check;
check = check_palindrome (string);
if (check == 0)
printf ("Not Palindrome\n");
else
printf ("Palindrome\n");
return 0;
}
int check_palindrome (char string [])
{
char duplicate [];
strcpy (string, duplicate);
strrev (string);
if (strcmp (string, duplicate) == 0)
return 1;
else
return 0;
}
这使用strcmp
和strrev
函数。
答案 5 :(得分:0)
此代码可以帮助您理解概念:
#include<stdio.h>
int main()
{
char str[50];
int i,j,flag=1;
printf("Enter the string");
gets(str);
for(i=0;str[i]!='\0';i++);
for(i=i-1,j=0;j<i;j++,i--)
{
str[i]=str[i]+str[j];
str[j]=str[i]-str[j];
str[i]=str[i]-str[j];
}
for(i=0;str[i]!='\0';i++);
for(i=i-1,j=0;j<i;j++,i--)
{
if(str[i]==str[j]){
flag=0;
break;
}
}if(flag==0)
{
printf("Palindrome");
}else
{
printf("Not Palindrome");
}
}