-1

これが完全なコードです。今も凍りついている

 typedef struct {
     char *name;
} NAME;

配列をnullに設定し、後で追加する必要があるエントリの数に応じて配列を拡張します。

NAME    *array = NULL;
int itemCount = 0; // items inserted
int arraySize = 0; // size of array
int arrayCount; //gets size of file.
int found = 0;

int Add(NAME item)
{
if(itemCount == arraySize) {

    if (arraySize == 0)
        arraySize = 3;
    else
        arraySize *= 2; // double size of array

    //relocate memory
    void *tempMemory = realloc(array, (arraySize * sizeof(NAME)));

    //error relocating memory
    if (!tempMemory)
    {
        printf("Couldn't relocate the memory \n");
        return(-1);
    }

    array = (NAME*)tempMemory;
}

array[itemCount] = item;
itemCount++;

return itemCount;
}
   void printStruct()
{
    int i;
    for(i = 0; i < arrayCount; i++)
    {
        printf("%s \n", array[i].name);
    }
}

int readFromFile()
{
    int checkResult(char[]);
    FILE *fp;
    fp = fopen("names.txt", "r");

    char names[arrayCount];

    if (fp == NULL)
    {
        printf("Cannot access file \n");
    }else{
        while(!feof(fp))
        {
            fscanf(fp, "%s", names);
            arrayCount++;
            checkResult(names);
        }
    }

    fclose(fp);

    return 1;
    }


int checkResult(char names[]){
    NAME tempStruct;

    int i;
    if(array == NULL)
    {
        tempStruct.name = malloc((strlen(names) + 1) * sizeof(char));
        strcpy(tempStruct.name, names);
        tempStruct.count = 1;
    }
    else
    {
        for(i = 0; i < arrayCount; i++)
        {
            if(strncmp(array[i].name, names, arrayCount)==0)
            {
                printf("MATCH %s", names);
                break;
            }
        }

        if(i == arrayCount)
        {
            tempStruct.name = malloc((strlen(names) + 1) * sizeof(char));
            strcpy(tempStruct.name, names);
        }


        if (Add(tempStruct) == -1)
        {
                return 1;
        }
    }
}

主に、メモリを解放し、他の関数を呼び出しています

int main(){
    void printStruct();
    int readFromFile();
    readFromFile();

    printStruct();

    int i;
    for (i = 0; i < arrayCount; i++)
    {
        free(array[i].name);
    }

    free(array);

    return 0;
}
4

1 に答える 1

3

ここで行っているのは、最初の一致を探してループし、見つかったらループを中断することです。配列内のどこにも見つからずに検索すると、それを追加します...

NAME** array = calloc( MAX_NAMES, sizeof( NAME* ) );
int    count = 0;

int checkName(char names[])
{
    if(!count)
    {
        array[0] = calloc( 1, sizeof( NAME ) );
        array[0]->name = malloc((strlen(names) + 1) * sizeof(char));
        strcpy(array[0]->name, names);
        count = 1;
    }
    else
    {
        int i;

        for(i = 0; i < count; i++)
        {
            if(strcmp(array[i]->name, names)==0)
            {
                printf("MATCH %s", names);
                break;
            }
        }

        if( i == count && count < MAX_NAMES )
        {
            array[count] = calloc( 1, sizeof( NAME ) );
            array[count]->name = malloc((strlen(names) + 1) * sizeof(char));
            strcpy(array[count]->name, names);
            count++;
        }
    }
}

上記のコードは、最初に配列が空でないことを確認するためにテストします...空である場合は、配列の最初の要素が作成され、名前が割り当てられます。

それ以外の場合は、配列を解析して、配列内のエントリが既に名前と一致しているかどうかを確認します...一致する場合は、ループが中断され、i == countテストが失敗するため、名前は追加されません。

名前が一致せずにループが終了した場合、i == countテストは true を返し、配列に空きがあれば新しい名前を配列の末尾に追加します。

于 2013-04-10T17:31:57.863 に答える