2016-04-27 7 views
1

これは、各インデックスから始まる大きな文字列の部分文字列をソートするためのCコードですが、コード内で配列aをどのようにソートできるかわかりません。Cで2つのポインタを等式にするとどうなりますか?

私の知る限り理解して:

  • 我々は&c[i]a[i]を参照してくださいので、それは、n個の配列を作成したが、ないではない &a[i][1] == &a[i+1][0]
  • a[i] = &c[i]以降、&a[i][0] == &c[i]は本当ですか?

  • これがそうでなければ、実際にはコピーしないでn(元の長さの 文字列)の配列をより速く作成するように見えます。本当?

私のコード

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 
#define M 1 
#define MAXN 5000000 
char c[MAXN], *a[MAXN]; 
int pstrcmp(char **p, char **q){ 
    return strcmp(*p, *q); 
} 
int main(){ 
    int i, ch, n = 0, maxi, maxlen = -1; 
    while ((ch = getchar()) != EOF) { 
     a[n] = &c[n]; 
     c[n++] = ch; 
    } 
    c[n] = 0; 
    qsort(a, n, sizeof(char *), pstrcmp); 
    printf("%s",a[1]); 
    return 0; 
} 
+3

"equation"は動詞ではありません - "assign"または "equalityの比較"を意味しますか?また、&a [i] [1] =&a [i + 1] [0] '? - いや、まったく違うものです。 –

+0

比較を意味する場合は、 '=='を使用します。割り当てを意味する場合は '='を使います。 – v7d8dpo4

+0

'pstrcmp'とは何か –

答えて

0

私はpstrcmpを推測しているが、ポインタをcharに二つのポインタを比較してstrcmpのラッパーです。ような何か:

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

は、あなたの質問に答えるために、

  • はい、&a[i][1] == &a[i+1][0]。どちらもi + 1 -st文字のcを指しています。
  • はい、&a[i][0] == &c[i]です。
  • 実際にはn文字列へのポインタを作成していますが、桁があります。つまり、最後の文字などの文字列を変更した場合は、さらに文字列を変更します。したがって、これらの文字列は独立していません。

概念的には、a[i]位置i始まるcのサフィックスへのポインタです。プログラムは次に、それらが指し示す文字列の値に従ってaをソートします。したがって、c = "abacaba"の場合、{ "a", "aba", "abacaba", "acaba", "ba", "bacaba", "caba" }となります。

suffix arraysを作成する方法がより速いことに注意してください。

+0

だから、配列aをソートするとき、a [1] [1]といった文字を変更しないのですか? – hardik24

+0

コード内の何も(読み取り部分の後に) 'c'を上書きしないので、文字自体は変更されません。変更されるのは、 'a'の要素の順序です。だから、並べ替えの前と後にポインタ 'a'を見ると、' c'の各文字を指し示す 'a'の中に正確に1つのポインタがありますが、その順序は変わります。そういう意味で、 'a [1]'が変更されたので、 'a [1] [1]'が変更されました。 –

0

このコードでは、ビルドしていないので、サブ文字列は表示されません。
は技術的には、aは、文字列の配列作ることができますタイプcharのポインタの配列ですが、あなたが効果的にaacをリンクする方法はcの指標です。
ループ内では、インデックスcharをcharで埋めます。後でaを並べ替えると、インデックスが並べ替えられます。

指数の問題点は、%s printfのフォーマット修飾子が期待するchar *ないよう、あなたが本当にそれを文字列としてプリントアウトすることができないこと、ですが、char **。これだけで、何か気になることが警告されるはずです。私はあなたがパラメータとしてハードコーディングa[1]としてこの問題を回避したのを見るが、あなたが間違った方法で行っていると指摘している、使用するインデックスの唯一の問題です。

ソートされた配列をどのように印刷するか、コードを少し編集しました。 だと思ったら、はあなたが望むことをしています。あなたが望むものとあなたのコードが何をするのかについて誤解があります(最後のprintfを除く)。

#include <stdlib.h> 
#include <string.h> 
#include <stdio.h> 
#define MAXN 5000000 
// This is an array of characters: 
char c[MAXN]; 
// This is an array of pointers pointing to individual characters. Essentially, this is an index. 
char *a[MAXN]; 
static int pstrcmp(const void *p1, const void *p2){ 
    // wrapper between strcmp and qsort's compare signature. 
    // See: man 3 qsort -- http://linux.die.net/man/3/qsort 
    return strcmp(* (char * const *) p1, * (char * const *) p2); 
} 
int main() { 
    int ch; 
    size_t n = 0; 
    while ((ch = getchar()) != EOF) { 
     // In this loop, you systematically build up an index, where a[i] points to c[i]. 
     a[n] = &c[n]; 
     c[n] = ch; 
     n++; 
    } 
    c[n] = 0; 
    qsort(a, n, sizeof(char *), pstrcmp); // Now, you sort the _index_. 
    printf("\nc: %s\n", c); // Print Original array. 
    printf("a: "); // Print Ordered array: 
    for (size_t i = 0; i < n; i++) 
     printf("%c", *a[i]); // Look at the indirection 
    printf("\n"); 
    return 0; 
} 
+1

興味深い。人々はdownvote来るが、なぜ彼らはdownvoteしたか回答を残しません:) – Koshinae

+0

編集したコードありがとう。配列をソートするときに配列cが変化しない理由を教えてください。 – hardik24

+0

'a'でポインタをソートするため、' c'自体の値ではないためです。 – Koshinae

関連する問題