Проблема в работе Циклического кода(21,11)

Здравствуйте, возникла проблема с программой кодирования и декодирования циклическим кодом. Дело в том, что кодирует она прекрасно, но декодирует не совсем хорошо. Она исправляет ошибку не в том месте, а именно на i+1 месте больше, чем надо. Вместо 16 бита исправляет 17. Помогите исправить, пожалуйста. Спасибо заранее!
Вот код:

#define mess 21
#define inputmess 11
#define checkcode 10
 
 
int main() {
    setlocale(LC_ALL, "Russan");
    char mes[mess]; //num_2
    char input[inputmess]; //num_1
    char check[checkcode] = { '1','0','0','0','0','0','1','0','0','1' }; //num_3
    char menu;
    char clmes[mess];
    
    int s = 0;
    int a = 0;
    while (1 != 0) {
        for (int i = 0; i < inputmess; i++)
        {
            input[i] = '\0';
        }
 
        for (int i = 0; i < mess; i++)
        {
            mes[i] = '0';
        }
        s = 0;
        a = 0;
        printf("\nCyclic code (21,11) \n\n Select operation: \n 1 - Coding \n 2 - Decoding \n\n Your choise: ");
        menu = getc(stdin);
        rewind(stdin);
        if ((menu != '1') && (menu != '2')) {
            while ((menu != '1') && (menu != '2')) {
                printf("Error! Wrong choise!\n");
                printf("Select operation: ");
                menu = getc(stdin);
                rewind(stdin);
            }
        }
        if (menu == '1') {
            printf("\n\n\n Enter your code for coding: ");
            for (int i = 0; i < inputmess; i++) {
                input[i] = getc(stdin);
                if (input[i] == '\n') {
                    s = i - 1; input[i] = '\0';
                    break;
                }
            }
 
            rewind(stdin);
 
            if (s != 0) {
                for (int i = 10; s > -1; s--) {
                    input[i] = input[s];
                    input[s] = '0';
                    i--;
                }
 
                for (int i = 0; i < inputmess; i++) {
                    if (input[i] == '\0') {
                        input[i] = '0';
                    }
                }
            }
 
 
 
 
 
            for (int i = 0; i < inputmess; i++) {
                mes[i] = input[i];
            }
 
            s = mess;
            while (s >= checkcode) {
                for (int i = 0; i < checkcode; i++) {
 
                    if (mes[mess - s + i] == check[i])
                    {
                        mes[mess - s + i] = '0';
                    }
                    else {
                        mes[mess - s + i] = '1';
                    }
                }
 
                bool a = true;
                int dop_s = s;
 
                for (int i = 0; i < checkcode; i++) {
                    if (mes[mess - dop_s + i] == '1') {
                        a = false;
                    }
                    if ((a == true) && (mes[mess - dop_s + i] == '0')) {
                        s--;
                    }
                }
            }
            printf("\n\n Coding mess: ");
 
 
            for (int i = 0; i < mess; i++) {
                if (i < inputmess) {
                    mes[i] = input[i];
                }
                printf("%c", mes[i]);
            }
        }
        if (menu == '2')
        {
            printf("\n\n Encrypted message: ");
            for (int i = 0; i < mess; i++) 
            {
                mes[i] = getc(stdin);
                clmes[i] = mes[i];
            }
            rewind(stdin);
 
 
            
 
            int s2 = 0; int bit_error = 0;
 
            while (1 != 0)
            {
                for (int i = 0; i < mess; i++)
                {
                    mes[i] = clmes[i];
                }
 
                char dop_per = clmes[0];
                for (int i = 0; i < mess-1; i++)
                {
                    clmes[i] = clmes[i + 1];
                }
                s2++;
                clmes[mess - 1] = dop_per;
 
                s = mess; 
                int s3 = 0;
 
                for (int i = 0; i < mess; i++)
                {
                    if (mes[i] == '0') { s3++; }
                    else { break; }
                }
 
                s -= s3;
                while (s >= checkcode)
                {
                    for (int i = 0; i < checkcode; i++)
                    {
                        if (mes[mess - s + i] == check[i])
                        {
                            mes[mess - s + i] = '0';
                        }
                        else
                        {
                            mes[mess - s + i] = '1';
                        }
 
                    }
 
                    bool tik = true; int dop_s = s;
 
                    for (int i = 0; i < checkcode; i++)
                    {
                        if (mes[mess - dop_s + i] == '1') { tik = false; }
                        if ((tik == true) & (mes[mess - dop_s + i] == '0'))
                        {
                            s--;
                        }
                    }
                }
 
 
                a = 0;
                for (int i = 0; i < mess; i++)
                {
                    if (mes[i] == '1') 
                    { 
                        a++; 
                        bit_error = i;
                    }
                }
                if (a == 1) 
                { 
                    break; 
                }
                if (a == 0) 
                { 
                    break; 
                }
            }
            
            if (a != 0)
            {
                if (clmes[bit_error] == '1')
                {
                    clmes[bit_error] = '0';
                }
                else
                {
                    clmes[bit_error] = '1';
                }
            }
 
 
            while (s2 != 0)
            {
                char dop_per = clmes[mess-1];
                for (int i = mess-1; i>0; i--)
                {
                    clmes[i] = clmes[i-1];
                }
                clmes[0] = dop_per;
                s2--;
            }
 
            if (a != 0)
            {
                printf("\n\n %d bit contains an error.", bit_error+1);
            }
            else
            {
                printf("\n\n No broken bits.");
            }
            printf("\n\n Corrected message: ");
 
            for (int i = 0; i < mess; i++)
            {
                printf("%c", clmes[i]);
            }
 
            printf("\n\n Original message: ");
 
            for (int i = 0; i < inputmess; i++)
            {
                printf("%c", clmes[i]);
            }
        }
 
        getc(stdin);
        system("cls");
    }
}