Making an Array to Hold Arrays of Character Arrays in C

后端 未结 5 1455
暖寄归人
暖寄归人 2021-01-17 10:04

My C is a little more than rusty at the moment, so I\'m failing to create something I think should be pretty basic.

Allow me to refer to character arrays as strings

5条回答
  •  臣服心动
    2021-01-17 10:48

    You have one-too-many pointers in both of your arrays.

    char arrayOfChars[50]; // a single array of characters
    char *arrayOfArraysOfChars[10]; // array to hold multiple single arrays of characters
    

    Since the arrayOfChars is being used like a buffer (new data always goes there first), you'll need to save a copy of the string into the arrayOfArrays. The POSIX function strdup should help here.

    Notice & and * are opposites, so &* and *& do absolutely nothing.

    You could also, make the arrayOfArrays literally that.

    char arrayOfChars[50]; // a single array of characters
    char arrayOfArraysOfChars[10][50]; // array to hold multiple single arrays of characters
    

    With this setup, you should use strcpy to copy the data into arrayOfArrays.


    Having read your edit, I think you need to start real simple. And FWIW the variable names are the wrong kind of Hungarian.

    For what I think you're trying to do, I'd start with just a single char array. This will be the main buffer, to hold strings that are being input and examined.

    enum { BUFSZ = 50 };
    char buf[BUFSZ + 1];
    

    Then you can use it with fgets or whatever.

    fgets(buf, BUFSZ, infile);
    

    To save these up in an array, I'd use strdup for its automatic trimming. If the strings are going to be mostly 2 characters long, I don't want 48 extra bytes being used for each one. So, an array of char pointers (strings).

    enum { STRVSZ = 40 };
    char *strv[STRVSZ + 1];
    int i;
    i = 0;
    strv[i] = strdup(buf);
    strv[i+1] = NULL; // This makes it an "argv-style" NULL-terminated array of strings
    ++i; // i is now the index of the next element, and a count of elements already added
    

    Each element of strv is a char pointer. But to preserve our sanity, we're trying to abstract away some of that distracting detail for a moment, and treat strings as a separate data type.

    Now to create lists of these, we do the same thing again. But there's no strdup-type function to make a duplicate of an array of pointers, so we have to separate the allocation and copying.

    enum { STRVVSZ = 20 };
    char **strvv[STRVVSZ + 1];
    int j;
    j = 0;
    strvv[j] = calloc(i+1, sizeof *strvv[j]); // assuming i is the count of elements 
    memcpy(strvv[j], strv, i * sizeof *strvv[j]);
    ++j; // j is now the index of the next string-pointer array in the array-of-same,
         // and a count of elements already added.
    

    Now, my names are just as silly as yours, but they're shorter!

提交回复
热议问题