Palindrome发现者在C?

时间:2015-10-25 21:48:43

标签: c palindrome

我正在尝试在C中制作回文查找器,我不知道它出错的地方,无论我在尝试编码的两种不同方式上得到输出错误。我刚刚开始使用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;
}

2 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分: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(..);

为用户提供简单的提示。

示例:

  雷达是回文

     

abba是回文

     

abcabc不是回文

请注意

这一事实
  

阿巴

由于“A”和“a”具有不同的ASCII码,

不被认为是回文:

  

'A'的值为65

     

'a'的值为97   根据{{​​3}}。您可以找到更多ASCII table

您可以避免此问题将字符串的所有字符转换为小写字符。 您可以执行此操作,包括<ctype.h>库并调用函数int tolower(int c);,如下所示:

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

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

here代码,请查看Earlz以深入了解该内容。

编辑:我做了一个简单的程序,看看它是否可以帮助你

#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]);
}

输入:

  

输入一个单词以检查它是否是回文:RadaR

输出:

  

雷达这个词是回文。