簡體   English   中英

在C中的回文取景器?

[英]Palindrome finder in C?

我正在嘗試使用C創建一個回文查找器,無論我嘗試編寫此代碼的2種不同方式使輸出為假,我都不知道它出了什么問題。 我才剛剛開始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;
}

請嘗試此,它工作正常。

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

看一下這段代碼,這就是我實現它的方式(請記住#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

根據ASCII表, “ a”的值為97。 你可以在這里找到更多。

您可以避免此問題將字符串的所有字符轉換為小寫字符。 您可以包括<ctype.h>庫並調用int tolower(int c);函數來完成此操作int tolower(int c); 像那樣 :

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

要么

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

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

輸出:

雷達一詞是回文。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM