Palindromes in C

时间:2016-06-27 17:00:36

标签: c

我编写了一个回文代码来检查给定的字符串是否是回文。例如:妈妈,1001 ......

MY_CODE:

#include <stdio.h>
#include <stdlib.h>
#include <stdio_ext.h>

int main()
{
  int i,n;
  char p[999];
  char flag;   

printf("number of characters in the strings");
scanf("%d",&n);
printf("Enter string: ");  
for (i=0;i<n;i++)
{
    printf("\n");
    __fpurge(stdin);
    scanf("%c",&p[i]);
}

for (i=0;i<n;i++)
{
    if (p[i]==p[n-1-i])
    {
        flag=0;
        break;
    }
    else flag=1;
}
if (flag==1)
    printf("It's not a palindrome");
if (flag==0)
    printf("It's a palindrome.");
return 0;
}

我试图这样做的想法是,如果匹配的是最后一个和第一个字符,那么接下来的字符。如果它们都匹配,那么字符串就是一个回文,否则它不是那么简单,但是我的输出 显示123;妈妈;每一个废话,一个回文(&#34;甚至是单词&#39;废话&#39;:D)。

有人可以指导我吗?

P.S。:我是新手,学习C.我的操作系统:Ubuntu 15.10。

2 个答案:

答案 0 :(得分:0)

你正在检查字符是否相同,是这样,设置flag = 0,说它是回文,但是第1次匹配会发生 - 如果没有其他匹配,则标志永远不会设置为不是一个回文。

更好的方法是假设它是一个回文,然后如果有什么提供,则将其设置为假。

#include <stdio.h>
#include <string.h>

int main()
{
  char p[999];

  printf("Enter string: ");
  if(fgets(p, sizeof(p), stdin))
  {
    int palindrome = 1;
    int i;
    int n;

    n = strlen(p);

    /* handle new line at end of fgets input */
    if(p[n-1] == '\n')
      p[n-1] = '\0';
    n = strlen(p);

    /* 0 length string (after newline removed) - not a palindrome */
    if(n == 0) palindrome = 0;

    for(i=0;i<n/2;i++)
    {
      /* look for a chatacter pair that doesn't match - if find, then we don't have a palindrome */
      if(p[i] != p[n-1-i])
        palindrome = 0;
    }
    if(palindrome)
      printf("is a palindrome\n");
    else
      printf("is not a palindrome\n");
  }
  return 0;
}

答案 1 :(得分:0)

从您的代码中,我有几点要说如下。

#include <string.h>
#include <stdio.h>
// #include <stdlib.h> // this is not necessary.

int main()
{

//   int i,n;  
//   char p[999];
//   char flag;   

// ###################################################### 
// You literally don't need to input the number of characters since you can get the string's length from `strlen`.
// In addition, different inputs yield different lengths,
// therefore, it is not applicable if the input becomes extremely long, for example.
//
// printf("number of characters in the strings");
// scanf("%d",&n); 
// printf("Enter string: ");
// for (i=0;i<n;i++)
// {
//     printf("\n");
//     __fpurge(stdin);
//     scanf("%c",&p[i]);
// }
// ###################################################### 

   char str[100];

   printf( "Enter a value :");
   gets( str );
   int i=0;
   int n;
   n = strlen(str)-1;

while (i<n)
{
    if (str[i++] != str[n--])
    {
        printf("%s is Not palidrome\n", str);
        return 0;
    }
}
printf("%s is palidrome\n", str);
// for (i=0;i<n;i++) 
// {
//     if (p[i]==p[n-1-i])
//     {
//         flag=0;
//         break;
//     }
//     else flag=1;
// }
// if (flag==1)
//     printf("It's not a palindrome");
// if (flag==0)
//     printf("It's a palindrome.");
return 0;
}

如上所述略有修改,该代码效果很好。

注意:回文问题是一个经典问题,您可以从互联网上找到许多解决方案。您可以在here的C中引用解决方案代码。

更新:以下是fgets和while循环的更新。

#include <string.h>
#include <stdio.h>

int main()
{
    char str[100];
    printf( "Enter a string (char/value) :");
    fgets (str, 100, stdin);
    int i=0;
    int n;
    n = strlen(str)-1;

    while (i<n)
    {
        if (str[i++] != str[n--])
        {
            printf("%s is Not palidrome\n", str);
            return 0;
        }
    }
    printf("%s is palidrome\n", str);
    return 0;
}