在C语言中判断输入是否���回文字符串

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;
}

3
你应该使用strlen而不是sizeof。 - Vaughn Cato
你的做法是错误的。你只比较了字符串的第一个字符。你需要比较所有的字符。另外,sizeof返回类型的大小,应该使用strlen。提示:使用另一个循环。 - MD Sayem Ahmed
2
永远不要使用gets()。 - Randy Howard
1
@user2023041,“gets”根本没有溢出保护。cppreference文档指出:“gets()函数不执行边界检查,因此该函数极易受到缓冲区溢出攻击。除非程序在限制标准输入的环境中运行,否则不能安全使用。由于这个原因,在C99标准的第三次修订中已经弃用了该函数,并在C11标准中完全删除。fgets()和gets_s()是推荐的替代品。” - chris
@user2023041,这里 是问题所在。 - Anish Ramaswamy
显示剩余2条评论
2个回答

4

我的 C 语言有点生疏,但你只需要搜索字符串长度的一半(减一)即可。

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;
}

我们可以把自增和自减操作融入到等式检查中,但这样会使代码阅读起来有些困难。

1

你的代码中有许多错误。

首先,reverseforward应该是char[]类型,而不是char。 使用strlen来查找字符串的长度。 sizeof不能工作。 sizeof(array)将始终返回(sizeof(char)*50)

在反转字符串时出现了错误。 它应该是reverse[i]=array[x]

要比较原始字符串和反转字符串是否相等,你的代码中由于变量reverse和forward是char类型,所以只比较了一个字符。 你应该使用strcmp函数比较原始(forward)和反转字符串(char数组)。

我已经纠正了它。这应该对每个测试用例都有效。

#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 上检查 DEMO


我现在可以轻松破解它,因为它仍然使用gets(),而你无法防止它。 - Randy Howard
我不认为从逻辑上讲使用gets有任何问题。@user2023041:使用gets没有问题,唯一的问题是它不安全,建议始终使用fgets。 - Ritesh Kumar Gupta
我一直认为答案应该解释为什么事情是错的。如果可能和适当的话(就像在这种情况下一样),还要解释由于这些错误会发生什么。这样,提问者可以理解后果并从错误中学习。 - Anish Ramaswamy
@AnishRam:什么?什么???????我没有解释清楚错误出在哪里和是什么吗?来吧。在点踩之前三思。在帖子被发布者接受后,世界上没有人会对上面的答案进行点踩。 - Ritesh Kumar Gupta
1
@ritesh_nitw,抱歉!我猜我被你的回答搞混了。哈哈,我撤回之前的评论。不幸的是,除非您编辑回答,否则我的踩票已经锁定。 - Anish Ramaswamy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接