2017-01-13 24 views
2

我写了一个程序,用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"); 
    } 
} 

什么是我的问题吗?谢谢。

+2

您需要复印。例如。 'char * copy = strdup(string); ''check = strcmp(strrev(copy),string);'...'free(copy);' – BLUEPIXY

+0

另外'char string [MAX_LEN] = {0};' - >'char string [MAX_LEN + 1 ] = {0};' – BLUEPIXY

+0

@BLUEPIXY,函数:'fgets()'不会超过输入缓冲区,并且会正确地将NUL字节插入到输入缓冲区的范围内,因此不需要再使输入缓冲区比MAX_LEN – user3629249

回答

2

关键是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 palindrome\n"); 
    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; 
} 
+1

我知道这是一个愚蠢的例子,但我会建议反对使用得到不披露,它是一个废弃,用户应该从来没有在真实世界中使用它 –

+1

你不应该使用gets(),这里有可能使用fgets()吗? – Ma250

+0

@FernandoCoelho我同意你的看法,我将示例改为使用fgets()的代码 – NoReceipt4Panda

4

从我可以告诉strrev也可能修改原始字符串,所以你需要复制它。

1

既然别人已经澄清的问题是什么,我想指出,这将是更快地检查是否S [ 0] == s [len-1],s [1] == s [len-2],直到检查了字符串的一半(向上舍入)。

这不需要额外的内存,不需要复制,只需要一半的比较。沿线的 东西:因为strrev修改字符串

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 palindrome\n"); 
      return; 
     } 
    } 
    printf("Palindrome\n"); 
} 
1

你的功能失效。你总是将反转的字符串与自己进行比较。

这里是不修改字符串替代的功能:

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 palindrome\n"); 
      return; 
     } 
    } 
    printf("Palindrome\n"); 
} 
0

你并不需要使用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; 
} 
相关问题