1

テキスト ファイルを読み取り、文字のペアが出現する回数をカウントするコードに取り組んでいます。たとえば、「aabbaa」を含むテキスト ファイル

出現回数はaa=2、ab=1、ba=1

次のような 2D 配列を使用できると考えていました。

char charPair[25][25] =   {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w ','x','y','z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

しかし、それは一文字しか返さないでしょう。

どんな助けでも大歓迎です!

4

2 に答える 2

3

重要: char-array を宣言すると、組み合わせが 255 回を超えるとエントリがオーバーフローするため、 に変更しlongます。

また、2D 配列には、使用しているアルファベットの各文字のインデックスが必要であることに注意してください。これは26文字であると想定します(たとえば、ASCII小文字のみ):

long charPair[26][26];
memset(charPair, 0, 26*26*sizeof(long));
char* reader = yourInput;
char current = *reader-'a';
++reader;
char next = *reader-'a';
while(next!=0) { // assumes \0-terminated
    charPair[current][next] += 1;
    current = next;
    next = *reader-'a';
    ++reader;
}

-'a'、文字 a が行/列 0 になり、z が 26 になるようにするためのものです。

EDIT:入力を最もよく読み取る方法に関するコメントについて:上記のコードは、入力全体が文字列に入れられていることを前提としています(\ 0で終了)

FILE* f = fopen(filename, "rb"); // (todo: add your error handling if 0 returned)
fseek(f, 0, SEEK_END);
int len = ftell(f);
fseek(f, 0, SEEK_SET);
char* yourInput = malloc(len+1); // (todo: add your error handling if 0 returned)
fread(yourInput, 1, len, f); // (todo: add your error handling if <len returned)
yourInput[len] = '\0';
fclose(f);
于 2013-02-15T21:16:08.727 に答える
0

c++っぽいCでは、必要に応じて変換してください、変数宣言、コメントなど...

...

char tCharPairCount[26][26]; // Lower-Case strings only
memset(tCharPairCount,0,26*26);

char tPrevChar = tempString[0];
for(int i=1; i<tempString.length(); ++i ) 
{
   char tCurrentChar = tempString[i];
   ++tCharPairCount[tPrevChar-'a'][tCurrentChar-'a'];
   tPrevChar = tCurrentChar;
}

...

// 結果を繰り返す

for(i:0->25)
for(j:0->25)
 printf("%i",tCharPairCount[i][j]);  // 0,0 => aa ; 1,0 => ba
于 2013-02-15T21:00:25.677 に答える