C语言 如何将数组与反向数组进行比较并检查它们的值是否匹配

  • 本文关键字:数组 是否 语言 比较 c string
  • 更新时间 :
  • 英文 :


我编写了一个程序,它使用 strrev() 函数反转数组并检查其值是否与原始值匹配,有点像回文。当值匹配时,它会打印Palindrome、否则Not a palindrome

但是当我比较它们并且值不匹配时,它仍然打印Palindrome.

这是代码:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <string.h>
#define MAX_LEN 100
void palindrom(char string[]);
int main()
{
    char string[MAX_LEN] = { 0 };
    printf("Enter string (max length 100 chars): ");
    fgets(string, MAX_LEN, stdin);
    if(string[strlen(string)-1] == 'n') { string[strlen(string)-1] = 0; }
    palindrom(string);
    return (0);
} 
void palindrom(char string[])
{
    int check = 0;
    check = strcmp(strrev(string), string);
    if (check == 0)
    {
        printf("Palindrome");
    }
    else
    {
       printf("Not a palindrome");
    }
}

我的问题是什么? 谢谢。

我所知strrev也可以修改原始字符串,因此您需要复制它。

关键是strrev

这里有一个 C 语言的程序,它将执行您正在测试的内容:

#include <stdio.h>
#include <string.h>
int main()
{
   char a[100], b[100];
   printf("Enter the string to check if it is a palindromen");
   fgets(a, 100, stdin);
   strcpy(b,a);
   strrev(b);
   if (strcmp(a,b) == 0)
      printf("Entered string is a palindrome.n");
   else
      printf("Entered string is not a palindrome.n");
   return 0;
}

由于其他人已经澄清了问题所在,我想指出,检查 s[0] == s[len-1], s[1] == s[len-2]会更快,直到检查了字符串的一半(向上舍入)。

这将不需要额外的内存,不需要副本和一半的比较。大致如下:

void palindrom(char string[])
{
    int len = strlen(string) - 1;
    int i, limit = len/2 + (len % 2);
    for (i = 0; i < limit; i++){
        if (string[i] != string[len-i]){
            printf("Not a palindromen");
            return;
        }
    }
    printf("Palindromen");
}

函数失败,因为strrev修改了字符串。您有效地始终将反转的字符串与自身进行比较。

下面是一个不修改字符串的替代函数:

void palindrom(const char *str) {
    for (size_t i = 0, j = strlen(str); i < j; i++, j--) {
        if (str[i] != str[j - 1]) {
            printf("Not a palindromen");
            return;
        }
    }
    printf("Palindromen");
}

您不需要使用 strrev 来测试回文 以下函数可以在不使用非标准 C 函数的情况下很好地检测回文:

int ispalindrome(char *str, int len)
{   
    char *p = &str[0];
    char *q = &str[len - 1];
    do
    {
        if(p >= q)
        {
            return 1;
        }
    } while (*p++ == *q--);
    return 0;
}

最新更新