Определение наличия слова с ровно одной гласной на Си

Написал программу для обработки входного текстового файла и определения наличия в нем слова с одной гласной буквой. Но при компиляции в gcc(терминал ubuntu в windows10) выдает ошибку *** stack smashing detected ***: terminated Aborted (core dumped). Прикладываю свой код:

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


typedef unsigned long long BitsetType;

const int bitsetLen = sizeof(BitsetType) * 8;
unsigned unicodeOffset = 1040;



    struct Bitset {

        BitsetType mask;

    };

    void init(Bitset* bs)
    {

    bs->mask = 0;

    }
        
    void makeUnion(Bitset* bs, const Bitset* const r)
    {

    bs->mask |= r->mask;

    }

    void makeIntersect(Bitset* bs, const Bitset* const r)
    {
        bs->mask &= r->mask;
    }

    
    void addElement(Bitset* bs, unsigned elementCode)
    {

        struct Bitset r;
        r.mask = (1ull << (elementCode - unicodeOffset));
        makeUnion(bs, &r);

    }

    void printSet(const Bitset* const bs)
    {

        for(int i = bitsetLen - 1; i >= 0; --i) {


            bool isCurrentBitZero = (bs->mask & (1ull << i)) == 0;
            if(isCurrentBitZero) {

                printf("0");

            } else {

                printf("1");

            }

        }
        printf("\n");

    }


    unsigned charToUnicode(unsigned char firstByte, unsigned char secondByte)
    {

        unsigned firstCode = firstByte & 31;
        unsigned secondCode = secondByte & 63;
        return (firstCode << 6) | secondCode;

    }

    void addElementsList(Bitset* bs, const char* charList)
    {

        unsigned int code;
        for(unsigned i = 0; i < strlen((char*)charList); i+=2)
        {

            unsigned char firstByte = charList[i];
            unsigned char secondByte = charList[i + 1];
            unsigned code = charToUnicode(firstByte, secondByte);
            addElement(bs, code);

        }

    }

    
int main()
{

    int symb;
    unsigned char buffer[50];
    unsigned code;
    int i;
    unsigned idx = 0;
    unsigned long long int count = 0;
    unsigned long long int word = 0;


    const char* vowelsList = "АаЯя";
    Bitset vowels;
    init(&vowels);
    addElementsList(&vowels, vowelsList);
    printSet(&vowels);


    while((symb = getchar()) != EOF) {


        if(symb == ' ' or symb == '\n') {

            Bitset bs;
            init(&bs);
            for(unsigned i = 0; i < idx; i+=2) {

                code = charToUnicode(buffer[i], buffer[i+1]);
                addElement(&bs, code);
    
            }

            makeIntersect(&bs, &vowels);
            if(bs.mask and ((bs.mask & (bs.mask - 1)) == 0)) {
                printf("Yes\n");
                break;
            
            } 
            else {

                printf("No\n");
            
            }
            idx = 0;
            continue;

        }
        buffer[idx] = symb;
        ++idx;
        code = 0;


    }

}

Ответы (0 шт):