Quite recently, at the university, we began to study strings in the C programming language, and as a homework, I was given the task of writing a program to remove extra words.
While writing a program, I faced an issue with iteration through a string that I could solve in a hacky way. However, I would like to deal with the problem with your help, since I cannot find the error myself.
The problem is that when I use the strlen(buffer) function as a for-loop condition, the code compiles easily and there are no errors at runtime, although when I use the __act_buffer_len variable, which is assigned a value of strlen(buffer) there will be a segmentation fault at runtime.
I tried many more ways to solve this problem, but the only one, which I already described, worked for me.
// deletes words with <= 2 letters
char* _delete_odd(const char* buffer, char delim)
{
    int __act_buffer_len = strlen(buffer);
    // for debugging purposes
    printf("__actbuff: %d\n", __act_buffer_len);
    printf("sizeof: %d\n", sizeof(buffer));
    printf("strlen: %d\n", strlen(buffer));
    char* _newbuff = malloc(__act_buffer_len + 1); // <- new buffer without words with less than 2 unique words
    char* _tempbuff; // <- used to store current word
    int beg_point = 0;
    int curr_wlen = 0;
    for (int i = 0; i < strlen(buffer); i++)       // no errors at runtime, app runs well
    // for (int i = 0; i < __act_buffer_len; i++)  // <- segmentation fault when loop is reaching a space character
    // for (int i = 0; buffer[i] != '\0'; i++)     // <- also segmentation fault at the same spot
    // for (size_t i = 0; i < strlen(buffer); i++) // <- even this gives a segmentation fault which is totally confusing for me
    {
        printf("strlen in loop %d\n", i);
        if (buffer[i] == delim)
        {
            char* __cpy;
            memcpy(__cpy, &buffer[beg_point], curr_wlen); // <- will copy a string starting from the beginning of the word til its end
            // this may be commented for testing purposes
            __uint32_t __letters = __get_letters(__cpy, curr_wlen); // <- will return number of unique letters in word
            if (__letters > 2) // <- will remove all the words with less than 2 unique letters
            {
                strcat(_newbuff, __cpy);
                strcat(_newbuff, " ");
            }
            beg_point = i + 1; // <- will point on the first letter of the word
            curr_wlen = buffer[beg_point] == ' ' ? 0 : 1; // <- if the next symbol after space is another space, than word length should be 0
        } 
        else curr_wlen++;
    }
    return _newbuff;
}
In short, the code above just finds delimiter character in string and counts the number of unique letters of the word before this delimiter.
 
    