-1

私はqsortcで関数を使用しています。組み込み関数です...長さが7未満の文字列でうまく機能します。長さが7を超える文字列では、「セグメンテーション違反(コアダンプ)」が発生します。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 100

static int cmpr( const void *a, const void *b) { 
    return strcmp( *(char **)a, *(char **)b);
}


int main()
{
    int t;
    char str1[MAX],str2[MAX];

    scanf("%d",&t);

    while(t--)
    {
    scanf("%s %s",str1,str2);

    int len1=strlen(str1)/sizeof(char *);
    int len2=strlen(str2)/sizeof(char *);

    qsort(str1, len1, sizeof(char *), cmpr);
    qsort(str2, len2, sizeof(char *), cmpr);

    if((strstr(str1,str2)!=NULL)&& (strlen(str1)==strlen(str2)))
        printf("YES");
    else if((strstr(str2,str1)!=NULL) && (strlen(str1)==strlen(str2)))
        printf("YES");
    else if((strstr(str2,str1)!=NULL) && (strlen(str1)!=strlen(str2)))
        printf("NO");
    else if((strstr(str1,str2)!=NULL) && (strlen(str1)!=strlen(str2)))
        printf("NO");
    else
    printf("YES");
}



return 0;
}

...理由は何ですか?

4

2 に答える 2

2

線だと思います

int len1=strlen(str1)/sizeof(char *);
int len2=strlen(str2)/sizeof(char *);

読む必要があります

int len1=strlen(str1);
int len2=strlen(str2);

次に、おそらく以下を変更する必要があります

qsort(str1, len1, sizeof(char), cmpr);
qsort(str2, len2, sizeof(char), cmpr);

コードがないので、関数も正しくないqsortと推測するのは危険です。cmpr

于 2012-12-02T13:34:06.343 に答える
1

qsort(str1, len1, sizeof(char *), cmpr);

sのブロックの配列をソートしますsizeof(char*) char-これはおそらくあなたが意図したものではありません。

このようなブロックのアドレスは、比較関数に渡されます。

static int 
cmpr(const void *a, const void *b) { 
  return strcmp(*(char **)a, *(char **)b);
}

ここで、aへのポインタとして解釈され、逆参照されchar*ます。次に、配列内のsのブロックsizeof(char*) charがに渡されstrcmp、0で終了する文字配列へのポインターとして解釈されます。おそらくそうではありません。

比較関数は、文字列のサフィックスを並べ替えたいように見えます。その場合は、str1ソートするために配列へのポインターの配列が必要です。

配列内のsを並べ替えるだけの場合charは、Ed Healが言ったように、次を使用する必要があります。

qsort(str1, strlen(str1), 1, cmpr);

(と同様)ですが、関数をstr2次のように変更する必要がありますcmpr

static int cmpr(const void* a, const void* b) {
    return *(char*)a - *(char*)b;
}

次に、それぞれの場所の文字を比較します。

于 2012-12-02T13:38:11.763 に答える