Как извлечь символы из массива символов - PullRequest
1 голос
/ 22 декабря 2010

Я пытаюсь извлечь массивы символов из буфера, но перестает работать после того, как он извлекает первый массив символов.

char *msg = "1~Message~ILOVEYOU\r\n2~Message~Doyouloveme?\r\n3~Message~OfcourseIdo!Not!\r\n";
char tempbuffer[1024];
char *tbuf;

tbuf = &tempbuffer[0];

/* Start parsing */
while (*msg != '\0') {

    while(*msg != '\n') {

        while (*msg != '\r') {
            *tbuf = *msg;
            msg++;
            tbuf++;
        } /* closing '\r' */

        msg++;
        tbuf++;
    } /* closing '\n' */

    *tbuf = '\0';

    /* Printout buffer for debugging purposes */
    printf("x %s\n", tempbuffer);

    /* Clear tempbuffer before starting to parse the buffer again */
    memset(tempbuffer, 0, sizeof((char) 1024));
} /* closing '\0' */

return 0;

}

printf показывает 1 ~ Message ~ ILOVEYOU и перестает работать.Я ожидаю следующий вывод

1~Message~ILOVEYOU
2~Message~Doyouloveme?
3~Message~OfcourseIdo!NOT!

Есть идеи?

Ответы [ 6 ]

2 голосов
/ 22 декабря 2010

Некоторые проблемы, которые я мог видеть:

1: неверный аргумент для memset.

Изменение

memset(tempbuffer, 0, sizeof((char) 1024));

до

memset(tempbuffer, 0, sizeof(tempbuffer));

На самом деле здесь нет необходимости в memset.

2: не увеличивать указатель msg при обнаружении \n.

Добавить

msg++;

до / после

*tbuf = '\0';

3: сброс tbuf к началу массива в начале каждой итерации

Добавить

tbuf = &tempbuffer[0];

Внутри первого while цикла.

4: *tbuf = '\0'; должно быть *(tbuf-1) = '\0';

как вы уже увеличили tbuf на данный момент.

Посмотри, как работает

2 голосов
/ 22 декабря 2010

Вам нужно сбросить tbuf так, чтобы он указывал на начало временного буфера, прежде чем запускать второй и последующие циклы.

1 голос
/ 22 декабря 2010

Используйте отладчик и пошагово пройдитесь по своей программе.Или сделайте это вручную с ручкой и бумагой.Что происходит, когда вы сталкиваетесь с первым '\ n'?Что происходит потом?Вы застряли на этом \ n, потому что вы никогда не перемещаете указатель чтения после печати проанализированного сообщения.

0 голосов
/ 22 декабря 2010

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

0 голосов
/ 22 декабря 2010

Вот фиксированный код ...

Проблемы:

  1. sizeof был не прав
  2. Вы не увеличивали сообщение после каждого '\ n'
  3. Вы не устанавливали tbuf обратно в начало tempbuffer после каждого '\ n'
  4. Хотя это не всегда сообщается как ошибка, вам не хватает некоторых включаемых файлов, которые могут вызвать проблемы
#include <string.h>
#include <stdio.h>



char *msg = "1~Message~ILOVEYOU\r\n2~Message~Doyouloveme?\r\n3~Message~OfcourseIdo!Not!\r\n";
char tempbuffer[1024];
char *tbuf = &tempbuffer[0];

int main( int argc, char *argv[] )
{

    argc = argc;
    argv[0] = argv[0];

    /* Start parsing */
    while( *msg != '\0' )
    {

        while( *msg != '\n' )
        {
            while( *msg != '\r' )
            {
                *tbuf = *msg;
                msg++;
                tbuf++;
            }
            msg++;
            tbuf++;
        }

        *tbuf = '\0';

        /* Printout buffer for debugging purposes */
        printf("x %s\n", tempbuffer);

        /* Clear tempbuffer before starting to parse the buffer again */
        memset(tempbuffer, 0, sizeof(tempbuffer));
        tbuf = &tempbuffer[0];
        msg++;
    }
    return 0;
}
0 голосов
/ 22 декабря 2010

* tbuf = '\ 0' должно быть * (tbuf-1), потому что вы добавляете конечный ноль после одного ненужного символа.А зачем тебе звонить в memset.Вы можете записать поверх старых данных в буфер.

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