Проблема с char [] в VS2008 - почему strcat добавляется в конец пустого массива? - PullRequest
1 голос
/ 07 января 2010

Я передаю пустой массив символов, который мне нужно рекурсивно заполнить, используя strcat(). Однако в отладчике VS массив не пуст, он полон странных ненужных символов, которые я не узнаю. Затем strcat () добавляет к концу этих ненужных символов, а не к началу массива.

Я также пытался encoded[0] = '\0' очистить мусор перед передачей массива, но затем strcat () ничего не добавляет к рекурсивному вызову.

Это код, который предоставляет массив и вызывает рекурсивную функцию:

char encoded[512];
text_to_binary("Some text", encoded);

Это рекурсивная функция:

void text_to_binary(const char* str, char* encoded)
{   
    char bintemp[9];
    bintemp[0] = '\0';

    while(*str != '\0')
    {
        ascii_to_binary(*str, bintemp);
        strcat(encoded, bintemp);
        str++;
        text_to_binary(str, encoded);
    }
}

Что происходит?

пс. Я не могу использовать std::string - я застрял с char*.

Редактировать: Это символ барахла в массиве: ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ ...

Ответы [ 6 ]

6 голосов
/ 07 января 2010

Вы не инициализируете массив. Изменения:

char encoded[512];

до

char encoded[512] = "";
3 голосов
/ 07 января 2010

strcat добавляет к концу строки, конец помечается \ 0, затем добавляет \ 0 к новой конечной позиции.

Вы должны очистить пункт назначения, закодированный либо с кодом [0] = 0; или memset первым.

2 голосов
/ 07 января 2010

char encoded[512]; .. encoded не инициализируется и будет содержать мусор (или 0xCCCCCCCC в сборках отладки).

1 голос
/ 07 января 2010

Решение вашей непосредственной проблемы уже опубликовано, но ваш text_to_binary по-прежнему неэффективен. По сути, вы вызываете strcat в цикле с всегда одной и той же строкой для конкатенации, и strcat необходимо выполнить итерацию по строке, чтобы найти ее конец. Это делает ваш алгоритм квадратичным. Что вам нужно сделать, так это самостоятельно отслеживать конец encoded и помещать содержимое bintemp прямо туда. Лучший способ написать цикл будет

while(*str != '\0')
{
    ascii_to_binary(*str, bintemp);
    strcpy(encoded, bintemp);
    encoded += strlen(bintemp);
    str++;
}

Вам не нужна рекурсия, потому что вы уже перебираете str (я считаю, что это правильно, так как ваш оригинальный код заполнит encoded довольно странно) Кроме того, в модифицированной версии encoded всегда указывает на конец исходной строки encoded, поэтому вы можете просто использовать strcpy вместо strcat.

1 голос
/ 07 января 2010

Ваша проблема была из-за инициализации кодирования, я думаю. Несколько комментариев о вашей программе:

лучше избегать рекурсии функция, когда вы можете сделать это с цикл.

Во-вторых, вы должны добавить размер кодируется, чтобы избежать возможного переполнения ошибка (в случае размера строки больше, чем закодировано).

void text_to_binary(const char* str, char* encoded)
{   
    char bintemp[9];
    bintemp[0] = '\0';
    encode[0] = '\0';

    for(const char *i = str; i!='\0'; i++)
    {
        ascii_to_binary(*i, bintemp);
        strcat(encoded, bintemp);
    }
}

PS: я не пробовал исходный код, поэтому в случае ошибки добавьте комментарий, и я исправлю его.

Хорошее продолжение вашего проекта.

0 голосов
/ 07 января 2010
  1. Вы не подключили источник ascii_to_binary, давайте предположим, что он заполнит буфер шестнадцатеричным дампом символа (в этом случае проще использовать sprintf(encoded+(i2),"%2x",*(str+i));
  2. Какой смысл рекурсивно вызывать text_to_binary? Я думаю, что это может быть проблемой.
...