Home > other >  How to add/delete element in Flat array in C
How to add/delete element in Flat array in C

Time:10-29

I have a structure inside which char array and int value is maintained. I want to treat this char array as a flat array to store the list of strings and the offset will track the starting position where the string is added in the array.

Structure is shown below:

struct A
{
   char element[256];
   int offset;
}

Also, I want to delete the strings after performing some operation if found.

Please let me know if this feasible. If yes then how?

CodePudding user response:

Since all we have to go on is the question if it's feasible - and the answer is yes. Here's a way showing that it is:

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct A A;
struct A {
   char element[256];
   int offset;
};

A *A_create() {
    A *a = malloc(sizeof *a);
    a->offset = 0;
    return a;
}

void A_destroy(A *a) {
    free(a);
}

// return false if the string doesn't fit
//        true if it's successfully added
bool A_add_string(A *a, const char *str) {
    size_t len = strlen(str);
    if(a->offset   len >= sizeof a->element) return false;
    memcpy(a->element   a->offset, str, len   1);
    a->offset  = len   1;
    return true;
}

You can now create an A, add \0 terminated strings to it and finally destroy it:

A *a = A_create();
A_add_string(a, "Hello");
A_add_string(a, "world");
A_destroy(a);

CodePudding user response:

Yes, append to a.element[a.offset].

To delete, set a.element[0] to the null byte. C strings end at a null byte.

#include <stdio.h>
#include <string.h>

typedef struct
{
   char element[256];
   int offset;
} A;

void A_append(A* a, const char *str) {
    // Concatenate on the end of element.
    strcat(&a->element[a->offset], str);

    // Increment the offset to the new end.
    a->offset  = strlen(str);
}

void A_delete(A* a) {
    a->element[0] = '\0';
    a->offset = 0;
}

int main() {
    A a = { .element = "" };
    a.offset = 0;

    char string1[] = "one";
    A_append(&a, string1);

    char string2[] = "two";
    A_append(&a, string2);

    puts(a.element);

    A_delete(&a);
    puts(a.element);
}

You can also store a pointer to the end of element. It's the same thing, just more direct.

#include <stdio.h>
#include <string.h>

typedef struct
{
   char element[256];
   char *end;
} A;

void A_append(A* a, const char *str) {
    // Concatenate nto the end of element.
    strcat(a->end, str);

    // Increment the pointer to the new end.
    a->end  = strlen(str);
}

void A_delete(A* a) {
    a->element[0] = '\0';
    a->end = a->element;
}

int main() {
    A a = { .element = "" };
    a.end = a.element;

    char string1[] = "one";
    A_append(&a, string1);

    char string2[] = "two";
    A_append(&a, string2);

    puts(a.element);

    A_delete(&a);
    puts(a.element);
}

Finally, if you want to store a list of strings, not concatenate them, consider storing them as pointers.

  • Related