diff --git a/qscr/c/gai/fixedynarr.c b/qscr/c/gai/fixedynarr.c index ac68857..1edf65d 100644 --- a/qscr/c/gai/fixedynarr.c +++ b/qscr/c/gai/fixedynarr.c @@ -1,68 +1,100 @@ #include #include #include +#include #include -struct IntArrayStr{ - int *data; + +/* + todo + change intarray into str array + make push array malloc for new str + make input strings instead of int (should use fgets?) +*/ + +struct StringArray{ + char **data; size_t length; size_t capacity; }; -void read_int_array_str(struct IntArrayStr *in_str) { +void print_SA(struct StringArray *in_str) { for (size_t i = 0; i < in_str->length; i++) { - printf("digit:%zu = %d\n", i, in_str->data[i]); + printf("word:%zu = %s\n", i, in_str->data[i]); } } -struct IntArrayStr *create_int_array_str(size_t in_capacity) { - struct IntArrayStr *mystr = malloc(sizeof(struct IntArrayStr)); //allocate memory for struct +struct StringArray *SA_create(size_t in_capacity) { + struct StringArray *mystr = malloc(sizeof(struct StringArray)); //allocate memory for struct - mystr->data = malloc(sizeof(int) * in_capacity); //make sure the pointer in the struct points to the array + mystr->data = malloc(sizeof(char*) * in_capacity); //make sure the pointer in the struct points to the array mystr->length = 0; //forgot to actually assign a value to the struct mystr->capacity = in_capacity; if (mystr->data == NULL) { - exit(0); + exit(1); } return mystr; } +int get_string_len(char *in_string){ + int length = 0; + char currchar; + do { + currchar = in_string[length]; + length++; + } + while (currchar != '\0'); + + printf("length of word: %d\n", length); //for some reason length is always 2 more than expected, so 1 more than necessary? apparently because of \n, not sure how to filter that. + return length; +} + + /* push value to struct, also handle realloc */ -void push_int_array_str(int in_int, struct IntArrayStr *in_str){ +void SA_push(char *in_string, struct StringArray *in_str){ if (in_str->length == in_str->capacity) { //check if already full in_str->capacity*=2; //if so we should double - printf("intarray capacity is now:%zu\n", in_str->capacity); - int *temp; //create a temporary pointer - temp = realloc(in_str->data, sizeof(int)*in_str->capacity); //realloc the data into a new bucket + printf("array capacity is now:%zu\n", in_str->capacity); + char **temp; //create a temporary pointer + temp = realloc(in_str->data, sizeof(char*)*in_str->capacity); //realloc the data into a new bucket if(temp == NULL){exit(0);}; //check if actually valid in_str->data = temp; //if valid, make sure the pointer in the struct points to the realloced block } - in_str->data[in_str->length] = in_int; - printf("number:%zu = %d\n", in_str->length, in_str->data[in_str->length]); + + char *newword = malloc(sizeof(char) * get_string_len(in_string)); //allocate memory for new string, apparantly my function already includes the length of null term + strcpy(newword, in_string); //copy word into memory + in_str->data[in_str->length] = newword; + printf("word:%zu = %s\n", in_str->length, in_str->data[in_str->length]); in_str->length++; //didn't read the flow when transferring and accidentally put this in the if block - printf("intarray length is now:%zu\n", in_str->length); + printf("array length is now:%zu\n", in_str->length); //also had an off-by-one error because I increased length before doing anything } + +void SA_free(struct StringArray *inp_str) { + for (size_t i = 0; i < inp_str->length; i++) { //for each pointer in array + free(inp_str->data[i]); //free at pointer + } + free(inp_str->data); //free pointer to pointers + free(inp_str); //free the struct +} + int main() { srand(time(NULL)); - printf("input numbers:\n"); + printf("input words:\n"); - struct IntArrayStr *myintarraystr = create_int_array_str(2); + struct StringArray *mystringarraystr = SA_create(2); - int input; - size_t length = 10; - - while (input != -1) { - scanf("%d", &input); - push_int_array_str(input, myintarraystr); - } + char input[50]; + do{ + fgets(input, sizeof(input), stdin); //get input from stdin of size input[] and put it in input + SA_push(input, mystringarraystr); //push the value of input into mystr + } while (*input != '-'); - read_int_array_str(myintarraystr); + print_SA(mystringarraystr); - free(myintarraystr->data); - free(myintarraystr); + SA_free(mystringarraystr); return 0; }