将strcmp与数组一起使用

时间:2013-04-10 17:27:19

标签: c arrays struct strcmp

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

 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;
}

1 个答案:

答案 0 :(得分: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,如果数组中有空间,我们将新名称添加到数组的末尾。