3

我对C相当陌生,我遇到了一些问题。我必须编写一个程序来接受用户输入并确定输入是否是回文。我有程序来反转输入,但我无法让字符串进行比较。所有输入都不是回文。我想使用整数下标索引来比较输入。另外我想忽略所有非字母字符,我认为这是一个 c.type 函数。

#include <stdio.h>
#include <string.h>
#define N 50

main()
{
    char array[N] = {0};
    char front;
    char end;
    char x;
    char w =0;
    char i;
    char forward;
    char reverse;

    printf("Enter Message: ");
    gets(array);

    front = sizeof(array);
    end = sizeof(array) - 1; 

    for( i = 0; i <= front; i++){      
       forward = array[i];

    } 
    for( x = end; x >= 0; x--){
       reverse = array[x];
    }

    if (forward != reverse){
       w = 1;
    }

    if(w == 1){
      printf("Not a Palindrome");
    } 
    else{
        printf("Palindrome");
    }

    printf("\n");
    return 0;
}
4

2 回答 2

4

我的 C 有点生疏,但你最多只需要搜索字符串长度的一半(减 1)。

int isPalindrome(char *str)
{
      char *p1 = str
      char *p2 = str + strlen(str) - 1;

      while(p2 > p1) {
          if (*p1 != *p2) return 0;
          p1++; p2--;
      }
      return 1;
}

我们可以在相等检查中使用自动递增和递减,但它有点难以阅读。

于 2013-03-28T04:27:00.283 回答
1

您的代码中有很多错误。

首先reverseforward应该是 type char[], not char。使用strlen查找字符串的长度。 sizeof不起作用。sizeof(array)总会回来的(sizeof(char)*50)

反转字符串时出错。应该是reverse[i]=array[x]

为了比较原始字符串和反向字符串是否相等,您只比较一个字符,因为变量 reverse 和 forward 在您的代码中属于 char 类型。您应该使用函数比较原始(正向)和反向字符串(字符数组)strcmp

我已经纠正了它。这应该适用于每个测试用例。

#include <stdio.h>
#include <string.h>
#define N 50
int main()
{
    char array[N] = {0};
    char front;
    char end;
    char x;
    char i;
    char forward[N];
    char reverse[N];

    printf("Enter Message: ");
    gets(array);

    front = strlen(array);
    end = strlen(array) - 1; 
    for( i = 0; i <= front; i++)
    {      
        forward[i]= array[i];

    } 
    for( i=0,x = end; x >= 0; i++,x--)
    {
        reverse[i]= array[x];
    }
    reverse[i]=0;
    if (strcmp(forward,reverse)!=0)
    {
        printf("Not a Palindrome");
    } 
    else{
        printf("Palindrome");
    }

    printf("\n");
    return 0;
}

在 IDEONE查看演示

于 2013-03-28T04:22:24.047 回答