2017-11-12 4 views
1

私は文字列の配列を持っていて、すべての文字列(存在する場合)の配列内の最初の擬似文字列を探したいと思います。だから私は最初に配列をソートしてから、逆の単語をバイナリ検索することにしました。だからここまでは私が今まで持っているものです:配列内の最初のpseudopalindromeを見つけよう

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

char len(char *x){ 
char len = 0; 

while (*x != '\0'){ 
    x++; 
    len++; 
} 

return len; 
} 

char compare(char *x, char *y){ 
char x0 = &x; 
char y0 = &y; 
while (*x != '\0'){ 
    if (tolower(*x) < tolower(*y)) return -1; 
    if (tolower(*x) > tolower(*y)) return 1; 
    x++; 
    y++; 
} 
// if we are here it means that strings are equal (case insensitive) 
x = &x0; 
y = &y0; 
while (*x != '\0'){ 
    if (*x > *y) return -1; 
    if (*x < *y) return 1; 
    x++; 
    y++; 
} 
// strings are equal (case sensitive) 
return 0; 
} 


char *reverse(char *x){ 
int i, j; 
char temp, *rev = NULL; 

rev = malloc(sizeof(char)*(len(x)+1)); 
rev = strcpy(rev,x); 
i = 0; 
j = len(x) - 1; 
while (i < j){ 
    temp = rev[i]; 
    rev[i] = x[j]; 
    rev[j] = temp; 
    i++; 
    j--; 
} 

return rev; 
} 

int binsearch(char *x, char *A, int len){ 
int l, r, m, index; 

l = 0; 
r = len - 1; 
index = -1; 
while (l <= r){ 
    m = (l + r)/2; 
    if (compare(x, A[m]) == 0){ 
     index = m; 
     r = m - 1; 
    } 
    else if (compare(x, A[m]) == -1) r = m - 1; 
    else l = m + 1; 
} 

return index; 
} 
int main() 
{ 

int n, i, j, k, fnd; 
char T[10000][101], temp[101]; 

scanf("%d", &n); 
for (i = 0; i < n; i++){ 
    scanf("%s", &T[i]); 
} 

for (i = 1; i < n; i++){ 
    strcpy(temp, T[i]); 
    j = i - 1; 
    while (j >= 0 && compare(T[j], temp) == 1){ 
     strcpy(T[j+1], T[j]); 
     j--; 
    } 
    strcpy(T[j+1], temp); 
} 

for (i = 0; i < n; i++){ 
    fnd = binsearch(reverse(T[i]), T, n); 
    printf("%d", fnd); 
} 
return 0; 
} 

このプログラムは実行を停止します。この問題はおそらく、すべての関数がうまく実行されるため、バイナリ検索で起こります。しかし、このバイナリ検索で何が問題になっていますか?それ以外に何がコードを破ることができますか?

+0

字体を修正してください。 –

+0

は、それ自体の逆である文字列です。お互いに逆転している2つの異なる文字列は回文ではありません。専門用語をまっすぐにしてください。 –

+0

'len'関数を書く必要はありません。 Cには 'strlen'という組み込み関数があり、これはあなたが書いたものとまったく同じです。 – selbie

答えて

0

問題を引き起こして戻り値の型が..バイナリ検索に何の戻り値の型が編集1.

を言及されていないんしかし、あなたはその宣言に関数の戻り値の型を言及していない

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

char len(char *x){ 
char len = 0; 

while (*x != '\0'){ 
    x++; 
    len++; 
} 

return len; 
} 

char compare(char *x, char *y){ 
char* x0 = x; 
char* y0 = y; 
while (*x != '\0'){ 
    int a0 = tolower(*x); 
    int b0 = tolower(*y); 
    if (a0 < b0) 
    return -1; 
    if (a0 > b0) 
    return 1; 
    x++; 
    y++; 
} 
// if we are here it means that strings are equal (case insensitive) 
x = x0; 
y = y0; 
while (*x != '\0'){ 
    if (*x > *y) return -1; 
    if (*x < *y) return 1; 
    x++; 
    y++; 
} 
// strings are equal (case sensitive) 
return 0; 
} 


char *reverse(char *x){ 
int i, j; 
char temp, *rev = NULL; 

rev = malloc(sizeof(char)*(len(x)+1)); 
rev = strcpy(rev,x); 
i = 0; 
j = len(x) - 1; 
while (i < j){ 
    temp = rev[i]; 
    rev[i] = x[j]; 
    rev[j] = temp; 
    i++; 
    j--; 
} 

return rev; 
} 

int binarysearch(char *x,char A[][101], int len){ 
int l, r, m, index; 

l = 0; 
r = len - 1; 
index = -1; 
while (l <= r){ 
    m = (l + r)/2; 
    if (compare(x, A[m]) == 0){ 
     index = m; 
     r = m - 1; 
    } 
    else if (compare(x, A[m]) == -1) r = m - 1; 
    else l = m + 1; 
} 

return index; 
} 
int main() 
{ 

int n, i, j, k, fnd; 
char T[10000][101], temp[101]; 

scanf("%d", &n); 
for (i = 0; i < n; i++){ 
    scanf("%s", &T[i]); 
} 

for (i = 1; i < n; i++){ 
    strcpy(temp, T[i]); 
    j = i - 1; 
    while (j >= 0 && compare(T[j], temp) == 1){ 
     strcpy(T[j+1], T[j]); 
     j--; 
    } 
    strcpy(T[j+1], temp); 
} 

for (i = 0; i < n; i++){ 
    fnd = binarysearch(reverse(T[i]), T, n); 
    printf("%d", fnd); 
} 
return 0; 
} 
+0

私はバイナリ検索からインデックスを返します – jakes

+0

私は 'int binsearch'(編集済み)と宣言しました。コピー中に間違っています。 – jakes

+0

これはコンパイルされません - binsearch宣言でエラーが発生しました: '('トークンの前に '...'という予期される宣言指定子があります – jakes

0

そうでもありませんコメントは、読んで痛いです。

コードをシンプルにすることもできます。それはまさにパリンドロームのためのいくつかのコードを持つことは非常に驚くべきことです。あなたが再実装しているいくつかの関数は、標準のc(strlen、strcasecmp、strdup)の一部です 単語が回文かどうかを知らせる関数は、本当にシンプルです。ここには何ができるのかのサンプル

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

bool isspeudopalindrom(const char *x){ 
    for (int i = 0; i < strlen(x)/2; ++i) { 
     if (tolower(x[i]) != tolower(x[strlen(x) - 1 - i])) 
      return false; 
    } 
    return true; 
} 

int main(int argc, char *argv[]) 
{ 
    for (int i = 1; i < argc; i++){ 
     if (isspeudopalindrom(argv[i])) 
      printf("palindrom\n"); 
     else 
      printf("not palindrom\n"); 
    } 
    return 0; 
} 
関連する問題