Search code examples
ccstring

search array for string


How would i implement this?Im trying to compare a array of c strings to a single string and if there is no match append it to the 2d array.

char*mprt,uni[100][16];
    mprt = &uni[0][0];
for (int s = 0;s <= 99;s++)
        {
            for (int z = 0;z <= 15;z++)
            {
                if (strcmp(mprt++, string1) != 0)
                {
                    uni[s][z] = string1[z];
                }
            }
        }

Solution

  • Ok ... from your comments I now get what you're trying to do. You'd want to make this into a function so you could feed words to it, but it should get you pointed in the right direction.

    Note that you can use char[][], but this way your strings can be of any length because we dynamically allocate them when we put them in the list.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
    
        /* space for 100 strings */
        char **uni = calloc(100, sizeof(char*));
        char **i;
    
        /* Put one word in the list for test */
        *uni = calloc(5, sizeof(char*));
        strncpy(*uni, "this", 5);
    
        /* here's the string we're going to search for */
        char * str2 = "that";
    
        /* go through the first dimension looking for the string 
           note we have to check that we don't exceed our list size */
        for (i = uni; *i != NULL && i < uni+100; i++)
        {
            /* if we find it, break */
            if (strcmp(*i,str2) == 0)
                break;
        }
    
        /* if we didn't find the string, *i will be null 
         * or we will have hit the end of our first dimension */
       if (i == uni  + 100)
       {
            printf("No more space!\n");
       }        
       else if (*i == NULL)
       {
            /* allocate space for our string */
            *i = calloc(strlen(str2) + 1, sizeof(char));
    
            /* copy our new string into the list */
            strncpy(*i, str2, strlen(str2) + 1);
        }
    
    
        /* output to confirm it worked */
        for (i = uni; *i != NULL && i < uni+100; i++)
            printf("%s\n",*i);
    }
    

    For completeness, the char[][] version:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
    
        char uni[100][16];
        int i,j;
    
        /* init our arrays */
        for (i=0;i<100;i++)
            for (j=0;j<16;j++)
                uni[i][j] = '\0';
    
    
        /* Put one word in the list for test */
        strncpy(uni[0], "this",15);
    
        /* here's the string we're going to search for */
        char * str2 = "that";
    
        /* go through the first dimension looking for the string */
        for (i = 0; uni[i][0] != '\0'  && i < 100; i++)
        {
            /* if we find it, break */
            if (strcmp(uni[i],str2) == 0)
                break;
        }
    
        /* if we didn't find the string, uni[i][0] will be '\0'
         * or we will have hit the end of our first dimension */
        if (i == 100)
        {
            printf("No more space!\n");
        }
        else if (uni[i][0] == '\0')
        {
            /* copy our new string into the array */
            strncpy(uni[i], str2, 15);
        }
    
        /* output to confirm it worked */
        for (i = 0; uni[i][0] != '\0' && i < 100; i++)
            printf("%s\n",uni[i]);
    }
    

    Edit to explain C pointers and arrays from comments below:

    In C, arrays degrade to pointers. This is actually really confusing when you first start.

    If I have char myArray[10] and I want to pass that to a function that takes a char * argument, I can use either &myArray[0] or just myArray. When you leave off the index, it degrades to a pointer to the first element in the array.

    In a multidimensional array like yours, &uni[5][0] == uni[5] - both are pointers to the first element in the second dimension at index 5 in the first. It degrades to char* pointed at the beginning of the 6th word in your list.