将malloc与函数和strcmp结合使用

时间:2019-07-14 17:21:06

标签: c malloc strcmp

我试图将malloc与我编写的函数结合使用,以增加唯一状态列表(无重复)

我的文件包含以下字符串:

Kmart, 295 Hartford Turnpike, Vernon CT

我编写的函数从文件中提取状态(“ CT”);

#define MAX_CHARS_PER_LINE 80
void getState(char strState[], const char strLine[])
{
   char newLine[MAX_CHARS_PER_LINE+1];
   char newState[MAX_CHARS_PER_LINE+1];

   strcpy(newLine, strLine); 
   char* token = strtok(newLine, ",");

   if(token != NULL)
   {
     token = strtok(NULL,",");
     token = strtok(NULL, ",");
   }
   strcpy(newState, token);

   unsigned long length = strlen(newState)-5; 

   strcpy(strState, newState+length); 

}

这是我的主要功能,我正在尝试使用strcmp查找唯一的状态列表,并使用malloc进行扩展。

int main(void)
{
   char **states[3];
   char buffer[MAX_CHARS_PER_LINE+1];

   FILE* fptr;    
   fptr = fopen(fileName, "r");

   if(fptr == NULL)
   {
     exit(EXIT_FAILURE);
   }
   else
   {
     while(fgets(buffer, sizeof(buffer), fptr))
     {
       getState(states, buffer);                  
     }

     for(int i = 0; i < 3; i++)
     {
        for(int j = 0; j < 3; j++)
        {
            if(strcmp(states[i], states[j]))
            {
                states[i] = malloc(3* sizeof(states));
            }            
        }        
    }
    fclose(fptr);       
    free(states);
}

return EXIT_SUCCESS;
}

我对如何正确使用malloc和strcmp获取此唯一列表有些困惑。我的get state函数工作正常,这只是我的主要问题,

1 个答案:

答案 0 :(得分:0)

几件事:

a。在getState函数中,将长度变量从strlen(newState)-5更改为strlen(newState)-2。状态只有2个字母,而strlen不计算终止字符。

b。不要对“状态”使用三重指针;使用双指针。它应该只是一串字符串。

c。将迭代器用于getState的状态列表。在调用GETSTATE之前,请务必重新分配MALLOC以增加大小并使用备份指针复制旧状态。

d。使用getState遍历状态数组。

e。为第二个迭代创建第二个数组以复制每个唯一的状态名称,或者仅创建一个新的字符串变量,在其上使用getState,然后使用strcmp遍历状态,如果没有匹配项,则将该状态添加到states数组中