Конкатенация строк со специальными конечными символами в C - PullRequest
0 голосов
/ 18 мая 2018

Я изучаю C и пытаюсь реализовать функцию

char *es_cat(char *dst, char *src)

, которая добавляет строку src в конец dst, но с небольшим поворотом:Считается, что строки заканчиваются символом '?' вместо обычного '\0'.Созданная строка должна заканчиваться '?', но первая строка '?' игнорируется.Вот моя попытка:

/* A simple function to determine the length of a string according to the
 * previously stated '?' constraint.
 */
unsigned int es_length(const char *s)
{
    const char *c = s;
    int amount = 0;
    while (*c != '?')
    {
        amount++;
        c++;
    }
    return amount;
}

char *es_cat(char *dst, char *src)
{
    int total = es_length(dst) + es_length(src) + 1; // + 1 for the last '?'
    char buffer[total]; 
    char *b = buffer;

    /* Copy the dst string. */
    while (*dst != '?')
    {
        *b = *dst;
        dst++;
        b++;
    }

    /* Concatenate the src string to dst. */
    while (*(src-1) != '?')
    {
        *b = *src;
        src++;
        b++;
    }
    printf("\n%s", buffer);
    return buffer;
}

int main(void)
{
    char cat_dst[] = "Hello ?"; // length according to es_length = 6
    char cat_src[] = "there! - Well hel?"; // length according to es_length = 17
    es_cat(cat_dst, cat_src);
    return 0;
}

Теперь, когда я бегу, я ожидаю вывод: Hello there! - Well hel?.Строка в основном такая же, но за ней следуют 3 символа мусора (если быть точным, вывод теперь Hello there! - Well hel?■@).Когда я добавляю или удаляю 3 символа из массива cat_src char, мусорные символы исчезают.Я неправильно инициализирую буфер или я что-то путаю с указателями?

С другой стороны, возможно ли объединить строку dst напрямую, т.е. не создавать буфер?

Заранее спасибо!

1 Ответ

0 голосов
/ 18 мая 2018

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

char *es_cat(char *dst, char *src)
{
    int total = es_length(dst) + es_length(src) + 2; // + 1 for the last '?' and +1 for the '\0'
    char *buffer = (char*)malloc(total);
    char *b = buffer;

    if (buffer == NULL)
        return NULL;

    /* Copy the dst string. */
    while (*dst != '?')
    {
        *b = *dst;
        dst++;
        b++;
    }

    /* Concatenate the src string to dst. */
    while (*src != '?')
    {
        *b = *src;
        src++;
        b++;
    }
    *b = '?';
    b++;
    *b = '\0';
    printf("\n%s", buffer);
    return buffer;
}
...