Во-первых, вам нужно убедиться, что twostr имеет достаточно места для хранения строки, которой вы управляете. Скорее всего, вам потребуется добавить дополнительную логику для выделения начального пространства, а также для выделения дополнительного пространства при необходимости. Что-то вроде:
size_t twostrLen = 256;
char* twostr = malloc(twostrLen);
Затем, вставив в него данные, вам нужно убедиться, что вы выделите дополнительную память, если ваш индекс превысит текущую длину twostrLen:
if (i >= twostrLen) {
char* tmp = twostr;
twostrLen *= 2;
twostr = malloc(twostrLen);
memcpy(twostr, tmp, i-1);
free(tmp);
}
Где i
- это смещение от twostr
, в которое вы собираетесь писать.
Наконец, при копировании из текущей строки в самую длинную строку, ваше условие завершения цикла равно c=*(twostr+i)) != '\0'
. Это сработает, когда c
соответствует '\0'
, выходя из цикла до того, как будет записан завершающий ноль. Вам нужно убедиться, что ноль записан, чтобы ваш цикл для печати строки работал правильно. Добавление следующего после внутреннего цикла for должно решить проблему:
*(twostr+longest_i+1+i) = 0;
Без этого наш последний цикл будет продолжать читать, пока не встретится нулевой символ. Это может быть сразу (как видно из вашего первого примера, где это работает), или может быть на некоторое количество байт позже (как ваш второй пример, где печатаются дополнительные символы).
Опять же, не забудьте проверить это longest_i+1+i < twostrLen
перед записью в это место.