简体   繁体   中英

Using malloc with functions and strcmp

I'm trying to use malloc with a function I wrote in order to grow a list of unique states(no duplicates)

My file contains strings such as;

Kmart, 295 Hartford Turnpike, Vernon CT

The function I wrote extracts the states("CT") from a file;

#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); 

}

This is my main function which I am trying to find the unique list of states using strcmp and grow it using 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;
}

I'm a bit confused on how to correctly use malloc and strcmp to get this unique list. My get state function works fine, it's just my main I have problems with

A few things:

a. In the getState function, change the length variable from strlen(newState)-5 to strlen(newState)-2. States are only 2 letters, and strlen doesn't count the terminating character.

b.Don't use a triple pointer for "states"; use a double pointer. It should just be a string of strings.

c. Use the iterator for the states list for getState. MAKE SURE TO RE-MALLOC TO INCREASE THE SIZE AND COPY THE OLD STATES WITH A BACKUP POINTER BEFORE CALLING GETSTATES

d. Iterate through the states array with getState.

e. Make either a second array for the second iteration to copy each unique state name, OR just make a new string variable, use getState on that, then iterate through states with strcmp, and if there's no matches, THEN add that state to the states array.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM