0

構造体配列に問題があります。テキスト ファイルを 1 行ずつ読み込み、値を並べて比較する必要があります。たとえば、"Mama" は、mama- があるため、2 ma , 1 am を返します。私は構造体を持っています:

typedef struct{
    char first, second;
    int count;
} pair;

文字列全体の構造体の配列を作成し、それらの構造体を比較する必要があります。また、メモリ割り当てについても紹介したので、任意のサイズのファイルに対して行う必要があります。ここで本当に問題が発生します。構造体の配列に適切にメモリを再割り当てするにはどうすればよいですか? これは今のところ私のメインです(コンパイルされず、明らかにこれに問題があるエラーがあります)。

int main(int argc, char *argv[]){
//allocate memory for struct
pair *p = (pair*) malloc(sizeof(pair));
//if memory allocated
if(p != NULL){
    //Attempt to open io files
    for(int i = 1; i<= argc; i++){
        FILE * fileIn = fopen(argv[i],"r");
        if(fileIn != NULL){
            //Read in file to string
            char lineString[137];
            while(fgets(lineString,137,fileIn) != NULL){
                //Need to reallocate here, sizeof returning error on following line
                //having trouble seeing how much memory I need
                pair *realloc(pair *p, sizeof(pair)+strlen(linestring));
                int structPos = 0;
                for(i = 0; i<strlen(lineString)-1; i++){
                    for(int j = 1; j<strlen(lineSTring);j++){
                        p[structPos]->first = lineString[i];
                        p[structPos]->last = lineString[j];
                        structPos++;
                    }
                }
            }
        }
    }
}
else{
    printf("pair pointer length is null\n");
}

}

これにより良い方法があれば、私は明らかに物事を変えて喜んでいます。上記の構造体を使用する必要があり、構造体の配列が必要であり、メモリ割り当てを操作する必要があります。それらが唯一の制限です。

4

2 に答える 2

3

構造体の配列にメモリを割り当てるのは、1 つの構造体に割り当てるのと同じくらい簡単です。

pair *array = malloc(sizeof(pair) * count);

次に、「配列」をサブスクライブすることで、各アイテムにアクセスできます。

array[0] => first item
array[1] => second item
etc

realloc 部分に関しては、次の代わりに:

pair *realloc(pair *p, sizeof(pair)+strlen(linestring));

(これは構文的に有効ではありません。realloc 関数プロトタイプとその呼び出しが同時に混在しているように見えます)、次を使用する必要があります。

p=realloc(p,[new size]);

実際、別の変数を使用して realloc の結果を格納する必要があります。これは、メモリ割り当てに失敗した場合、既に割り当てられているメモリを残したまま NULL を返すためです (その後、メモリ内での位置が失われることになります)。しかし、ほとんどの Unix システムでは、カジュアルな処理 (重負荷のタスクではない) を行っているときに、malloc/realloc が NULL を返すポイントに到達することは、どういうわけかまれなケースです (すべての仮想空きメモリを使い果たしたに違いありません)。それでも、次のように書く方が良いです:

pair*newp=realloc(p,[new size]);
if(newp != NULL) p=newp;
else { ... last resort error handling, screaming for help ... }
于 2012-04-17T19:02:22.473 に答える
0

では、これが正しければ、文字のペアが何回出現するかを数えることになりますか? 頻度表を 64KB の配列に保持できるのに、ネストされたループをいじったり、そのペア構造体を使用したりするのはなぜですか。これは、はるかに単純で桁違いに高速です。

これは大まかに私がすることです(ネタバレ注意:特にこれが宿題である場合は、コピー/貼り付けしないでください):

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

void count_frequencies(size_t* freq_tbl, FILE* pFile)
{
    int first, second;

    first = fgetc(pFile);
    while( (second = fgetc(pFile)) != EOF)
    {
        /* Only consider printable characters */
        if(isprint(first) && isprint(second))
            ++freq_tbl[(first << 8) | second];

        /* Proceed to next character */
        first = second;
    }
}

int main(int argc, char*argv[])
{
    size_t* freq_tbl = calloc(1 << 16, sizeof(size_t));;
    FILE* pFile;
    size_t i;

    /* Handle some I/O errors */
    if(argc < 2)
    {
        perror ("No file given"); 
        return EXIT_FAILURE;
    }

    if(! (pFile = fopen(argv[1],"r")))
    {
        perror ("Error opening file"); 
        return EXIT_FAILURE;
    }

    if(feof(pFile))
    {
        perror ("Empty file"); 
        return EXIT_FAILURE;
    }

    count_frequencies(freq_tbl, pFile);

    /* Print frequencies */
    for(i = 0; i <= 0xffff; ++i)
        if(freq_tbl[i] > 0)
            printf("%c%c : %d\n", (char) (i >> 8), (char) (i & 0xff), freq_tbl[i]);
    free(freq_tbl);

    return EXIT_SUCCESS;
}

ビット操作と16進表記でごめんなさい。たまたまcharテーブルのコンテキストでそれらが好きですが、わかりやすくするために、乗算や加算などに置き換えることができます。

于 2012-04-17T23:01:43.397 に答える