2017-04-04 8 views
0

文字列を調べて、可能なパリンドロームを特定し、それがパリンドロームかどうかをチェックし、長さをpalindromelength()から返すか、ストリングの最長のパリンドローム。 プログラムはコンパイルされていますが、出力が間違っています。文字列中の最長のパリンドロームとその長さ

これは私のコード

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
int palindromelength(char *str, int i, int j){ 
    char *start = str; 
    char *end = str + j; 
    while(start < end){ 
     if(*start != *end) 
      return -1; 
     start++; 
     end--; 
    } 
    return j-i+1; 
} 
void ispalindrome(char *str){ 
    int length = 1, max = 1, start =0, i, j; 
    for(i=0; i<= strlen(str) -2; i++){ 
     for(j= 1; j <= strlen(str)-1; j++){ 
      if(abs(i-j) > 1){ 
       length = palindromelength(str, i, j); 
       if(length> max){ 
        max = length; 
        start = i; 
       } 
      } 
     } 
    } 
    if(max > 1){ 
     printf("Largest palindrome is "); 
     for(; start <= j; start++){ 
      printf("%c", str[start]); 
      start++; 
     } 
    } 
    else 
     printf("No palindromes in string."); 
} 

int main(void) { 
    char a[50]; 
    char *a2; 
    printf("Enter a string\n"); 
    scanf("%[^\n]", a); 

    int length = strlen(a) + 1; 
    a2 = (char*)malloc(length*sizeof(char)); 
    strcpy(a2, a); 
    free (a2); 

    char *a3 = &a; 
    ispalindrome(a3); 

    return 0; 
} 

である私は単純な文字列、 "aracecar" とは別にpalindromelength()を試してみました。 palindrimelength(a3, 0, 4)は-1を返しますので、palindromelength(a3, 0, 3)は3を返しますが、palindromelength(a3, 1, 7)は-1を返します。間違っています。私はスタックのオーバーフローで他のものと私の関数をダブルチェックし、それが正しいように、何が問題になる可能性がありますか? 第2の機能に関しては、ispalindrome()があります。私はそれを書くより良い方法はありますか?ちょうどちょっと面倒なことが分かりました。

私は初心者ですから、これを解決するためにもっと高度で洗練されたバリエーションをまだ学んでいないかもしれません。

+1

デバッガの使い方を学びます。別のコード行を書く前にそれを学んでください。それは不可欠なスキルです。 @ThingyWotsit。 – ThingyWotsit

+0

私は個人的なラップトップで学び始めましたが、私はラップトップを街から忘れてしまい、週末までは持ち歩くことはできません。今のところ私はデバッガにアクセスできない学校のコンピュータを使用していますが、私の教授は構文のハイライトとコンパイラのみを使用できます。だから私はここにきて助けに来た。 – JOhAnn4187

+0

教授に、誰もが時間を無駄にしていると教えてください。デバッグに関する次の講義を行い、必要なツールを使用できるようにする必要があります。 – ThingyWotsit

答えて

0

私は、文字列の開始インデックスをintと仮定し、intは終了インデックスです。そうであれば、palindromelength()関数の最初の行をよく見てください。関数はインデックス0以外のどこかから始めることができますか?

ispalindrome()関数を実行する方法として、入力が回文かどうかをチェックするためのアルゴリズムが多数ありますので、周りを見渡してさまざまな方法を見つけることをお勧めします。あなたの方法がうまくいくなら、素晴らしい!おそらく最もクリーンな方法は再帰を使用することですが、それはいくつかの考えを取ることができます。

関連する問題