как распознать строку с цветовым кодом с помощью strncmp в c?

У меня есть две программы на C:
клиент и сервер.

Я не буду разрабатывать все детали кода, все работает нормально. За исключением этого пункта: я хочу, чтобы мой сервер отправлял цветные сообщения подтверждения, а мой клиент идентифицировал их.

На сервере строки выглядят так:

    //server side there there is:
    FILE * stream; // for the socket

    fprintf(stream,"\x1b[31m220\x1B[0m GET command received please type the file name\n");
    //here stream refers to a classic BSD socket which connect client to server
    //\x1b[31m colors text in red
    //\x1B[0m put back text color to normal

И мне интересно, какой код я должен использовать для обнаружения подтверждения на клиенте:

    //Client side there is:
    FILE * stream; // for the socket (client side)
    char buffer[100]; //to receive the server acknowledgment

    //fgets put the received stream text in the buffer:
    fgets (buffer , sizeof buffer, stream);
    
    //Here strncmp compares the buffer first 11 characters with the string "\x1b[31m220"
    if (strncmp (buffer, "\x1b[31m220",11)== 0)
    {
    printf("\x1B[48;5;%dmCommand received\x1B[0m%s\n",8,buffer);
    }

Вещи не работают. Интересно, что мне поставить вместо "\x1b[31m220",11 в клиенте, чтобы все заработало. Я подозреваю, что некоторые символы цветового кода интерпретируются и поэтому исчезают из строки, но какие именно?


Здесь есть объяснение цветового кода: stdlib и цветной вывод в C


person Tercé Nicolas    schedule 28.06.2020    source источник
comment
//Here strncmp compares the buffer first 11 characters вот в чем проблема, \x1b занимает всего 1 символ, это экранирующий код, должно быть 8.   -  person David Ranieri    schedule 28.06.2020


Ответы (2)


"\x1b[31m220" имеет 8 символов, а не 11. strncmp завершится ошибкой на 9-м символе, который равен '\0' в этой строке и '\x1B' в буфере.

person Antti Haapala    schedule 28.06.2020

Упростите себе жизнь и позвольте компилятору рассчитать размеры за вас:

#define COLOURCODE "\x1b[31m220"

if (strncmp (buffer, COLOURCODE, sizeof(COLOURCODE) - 1)== 0)
person 0___________    schedule 28.06.2020