2015-10-25 2 views
0

Я пытаюсь сделать palindrome finder в C, и я не знаю, где это происходит, независимо от того, что я получаю вывод false на 2 разных способах, которые я пытался кодировать. Я только что начал C (на прошлой неделе), поэтому, если бы вы могли объяснить вещи просто, это было бы здорово, спасибо!Palindrome finder in C?

//way1 
#include <stdio.h> 

int read_char() { return getchar(); } 
void read_string(char* s, int size) { fgets(s, size, stdin); } 

void print_char(int c)  { putchar(c); } 
void print_string(char* s) { printf("%s", s); } 


int is_palin(char word[]) { 

    int m = 0; 
    int arr_len = sizeof(word)/sizeof(char); //change to char_index 
    int n = arr_len; 
    int t = 1; 

    if(n % 2 != 0) { 
    for (m=0; m < ((n-1)/2); m++) { 
     if(word[m] != word[n-m-2]) { 
     t = 0; 
     } 
     else { 
     t = 1; 
     } 
    } 
    } 
    else { 
    for (m=0; m < (n/2)-1; m++) { 
     if(word[m] != word[n-m-2]) { 
     t = 0; 
     } 
     else { 
     t = 1; 
     } 
    } 
    } 

    if(t == 1) { 
    return 1; 
    } 
    else { 
    return 0; 
    } 
} 

int main(void) { 
    char word[6] = "civic"; 
    int arr_len = sizeof(word)/sizeof(char); 

    if (is_palin(word) == 1) { 
    printf("is palin\n"); 
    } 
    else { 
    printf("is not palin\n"); 
    } 

    printf(word); 
    printf("\n"); 
    printf("%d\n", arr_len); 
    return 0; 
} 

//////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////// 

//way2 
#include <stdio.h> 

int read_char() { return getchar(); } 
void read_string(char* s, int size) { fgets(s, size, stdin); } 

void print_char(int c)  { putchar(c); } 
void print_string(char* s) { printf("%s", s); } 


int is_palin(char word[]) { 
    int m = 1; 
    int input_length = sizeof(word); 
    int j = input_length-1; 
    int i = 0; 

    for(i=0; i <= j; i++) { 
    if(word[i] != word[j]) { 
     m = 0; 
     j--; 
    } 
    } 

    if(m == 1) { 
    return 1; 
    } 
    else { 
    return 0; 
    } 
} 


int main(void) { 
    char word[6] = "civic"; 
    int input_length = sizeof(word); 

    if (is_palin(word) == 1) { 
    printf("is palin\n"); 
    } 
    else { 
    printf("is not palin\n"); 
    } 

    printf(word); 
    printf("\n"); 
    printf("%d\n", input_length); 
    return 0; 
} 
+5

'sizeof word' не приводит к тому, что вы ожидаете. Вам действительно нужна strlen() здесь. – wildplasser

+0

..что вы бы нашли себя очень быстро, если бы использовали отладчик. «Я только что начал C (на прошлой неделе)« Хорошо, но вам нужно научиться отлаживать СЕЙЧАС, прежде чем писать код. –

+0

... но включение нескольких инструкций printf() в стратегических точках может быть столь же эффективным, как * использование отладчика *. BTW: fgets() читает ввод *, включая окончательный '\ n' * Вы, вероятно, захотите сначала удалить это, прежде чем пытаться найти (нет) палиндромы. – wildplasser

ответ

0

Пожалуйста, попробуйте это, он отлично работает.

#include <stdio.h> 

    int main() 
    { 
     int flag = 0; 
     int length = 0; 
     int len2 = 0; 
     int i = 0; 
     char name[130]; 
     char p[130]; 
     char q[130]; 

     printf("please enter a name or sentence\n"); 
     scanf("%[^\n]", name); 

     length = strlen(name); 
     len2 = length; 
     strcpy(p, name); 
     memset(q, '.', length); // handy to debug comparaison 
     q[length] = '\0'; 

     for (i = 0; i < length; i++) 
     { 
     q[--len2] = p[i]; 
     } 

     printf("\n p==%s", p); 
     printf("\n q==%s", q); 
     getchar(); 

     if (!strcmp(p, q)) 
     flag = 1; 

     if (flag == 1) 
     printf("\npalindrome\n"); 
     else 
     printf("\nnot a palindrome\n"); 

     return 0; 
    } 
0

Взгляните на этот код, вот как я реализовал его (не забудьте #include <stdbool.h> или он не будет работать):

for(i = 0; i < string_length; i++) 
    { 
      if(sentence[i] == sentence[string_lenght-1-i]) 
        palindrome = true; 
      else 
      { 
        palindrome = false; 
        break; 
      } 
    } 

Делая что он будет проверять, если ваше предложение является палиндром и, при первом вхождении это неверно, он сломает цикл for. Вы можете использовать что-то вроде

if(palindrome) 
    printf(..); 
else 
    printf(..); 

для простого запроса для пользователя.

Пример:

радар палиндром

авва является палиндром

abcabc не палиндром

Пожалуйста, обратите внимание на то, что

Авва

не распознается как палиндром из-за того, что 'A' и 'а' имеют различные коды ASCII:

'А' имеет значение 65

' a 'имеет значение 97 согласно ASCII table. Вы можете узнать больше here.

Вы можете избежать этой проблемы, преобразуя все символы строки в символы нижнего регистра. Вы можете сделать это в том числе <ctype.h> библиотеку и вызова функции int tolower(int c); так:

for (; *p; ++p) *p = tolower(*p); 

или

for(int i = 0; str[i]; i++){ 
    str[i] = tolower(str[i]); 
} 

Код по Earlz, посмотрите на this Q&A смотреть глубже в это.

EDIT: Я сделал простую программу, чтобы сделать это, увидеть, если он может помочь вам

#include <stdio.h> 
#include <string.h> 
#include <stdbool.h> 
#include <stdlib.h> 
#include <ctype.h> 

void LowerCharacters(char *word, int word_lenth); 

int main(void){ 

    char *word = (char *) malloc(10); 
    bool palindrome = false; 

    if(word == 0) 
    { 
     printf("\nERROR : Out of memory.\n\n"); 
     return 1; 
    } 

    printf("\nEnter a word to check if it is palindrome or not : "); 
    scanf("%s", word); 

    int word_length = strlen(word); 

    LowerCharacters(word,word_length); 

    for(int i = 0; i < word_length; i++) 
    { 
     if(word[i] == word[word_length-1-i]) 
      palindrome = true; 
     else 
     { 
      palindrome = false; 
      break; 
     } 
    } 

    palindrome ? printf("\nThe word %s is palindrome.\n\n", word) : printf("\nThe word %s is not palindrome.\n\n", word); 

    free(word); 

return 0; 

} 

void LowerCharacters(char *word, int word_length){ 

    for(int i = 0; i < word_length; i++) 
     word[i] = tolower(word[i]); 
} 

Вход:

Введите слово для проверки, если это палиндром или нет: РАДАР

Выход:

Слово радар является палиндром.