-1

这是完整的代码。现在一直结冰

 typedef struct {
     char *name;
} NAME;

将数组设置为空,然后我根据需要添加多少条目来扩展它。

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 回答