【问题标题】:Determine if input is a palindrome in C确定输入是否是C中的回文
【发布时间】:2013-03-28 04:07:31
【问题描述】:

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

【问题讨论】:

  • 你想使用 strlen 而不是 sizeof
  • 你做错了。您只比较字符串的第一个字符。您将需要比较所有字符。同样sizeof 返回类型的大小,使用strlen。提示:使用另一个循环。
  • 使用strrev和strcmp算作弊吗?
  • 不要使用gets()。永远。
  • @user2023041, gets 根本没有溢出保护。取自 cppreference 文档:gets() 函数不执行边界检查,因此该函数极易受到缓冲区溢出攻击。它不能安全使用(除非程序在限制标准输入上出现的内容的环境中运行)。出于这个原因,该功能在 C99 标准的第三次勘误中已被弃用,并在 C11 标准中完全删除。 fgets() 和 gets_s() 是推荐的替代品。

标签: c palindrome


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您的代码中有很多错误。

    首先 reverseforward 应该是 char[] 类型,而不是 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 检查DEMO

    【讨论】:

    • 我现在可以破解它,只是因为它仍然使用gets(),你无法阻止它。
    • 从逻辑上我不认为,使用gets有什么问题。 @user2023041:gets 没有问题。唯一的问题是它不安全,总是建议使用 fgets 而不是gets
    • -1。我一直认为答案应该解释为什么事情是错误的。此外,如果可能且适当(就像在这种情况下一样),请解释由于这些错误而发生的what。这样,OP 就可以了解后果并从错误中吸取教训。
    • @AnishRam:什么?什么???????我没有解释过,错误在哪里,有什么错误?来吧。在投反对票之前三思而后行。这个世界上没有人会在答案被海报接受后投反对票
    • @ritesh_nitw,哎呀!我想我被你的回答弄糊涂了。我收回那句话哈哈。不幸的是,在您编辑答案之前,我的反对票已被锁定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多