2017-01-13 19 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; 
} 
相關問題