C: сравнение строк - PullRequest
       2

C: сравнение строк

0 голосов
/ 12 декабря 2018
bool done;
done = false;
while (!done) {
    /* read the message */
    bzero(msg, 100);
    printf("[client]Type something: ");
    fflush(stdout);
    read(0, msg, 100);
    if (strcmp(msg, "/done") == 0) {
        done = true;
        /* sending the message to the server */
        if (write(sd, msg, 100) <= 0) {
            perror("[client]Error sending the message to the server.\n");
            return errno;
        }
    } else {
        /* sending the message to the server */
        if (write(sd, msg, 100) <= 0) {
            perror("[client]Error sending the message to the server.\n");
            return errno;

        /* reading the answer given by the server*/
        if (read(sd, msg, 100) < 0) {
            perror("[client]read() error from server.\n");
            return errno;
        }
        /* printing the received message */
        printf("[client]The received message is: %s\n", msg);
    }
}

Вот код, с которым у меня проблема.Поэтому я хочу отправлять сообщения на сервер, пока не отправлю сообщение «/ done», код работает, я отправляю сообщения непрерывно, но даже когда я печатаю и отправляю «/ done», процесс не заканчивается.

Я думаю, что есть проблема с функцией bzero, которая "очищает" сообщение или, может быть, я не очень хорошо понимаю это.

Я также попытался написать свою собственную функцию, чтобы проверить, совпадают ли две строки,но также не влияет.

Итак, как мне написать условие или «очистить» сообщение, чтобы я мог отправлять сообщения непрерывно, а после отправки «/ done» выполнение заканчивается?

PSmsg объявлено ранее в коде как char msg [100];

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Когда вы читаете с 0, вы читаете со стандартного ввода.Если это терминал, в который вы вводите (вы не говорите), скорее всего, он настроен в обычном (каноническом) режиме, поэтому вы прочитаете строку, которая, вероятно, содержит символ новой строки (\ n).Поэтому, когда вы вводите /done, строка, которую вы получите в буфере сообщений, будет "/done\n", что не соответствует "/done" ...

0 голосов
/ 12 декабря 2018

TCP не является протоколом сообщений.Он не склеивает байты в сообщения.Если вы хотите использовать TCP для отправки и получения сообщений, вам нужно реализовать функции, которые отправляют и получают сообщения.

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

0 голосов
/ 12 декабря 2018

read (2) включает в себя '\ n' в конце строки.Когда вы используете низкоуровневое чтение, вы получаете все.При попытке отладки строк может быть полезно поместить кавычки в оператор вывода, например

printf("[client]The received message is: '%s'\n", msg);

, поскольку это сразу показывает невидимые пробелы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...