Копирование подстроки в начало строки в C

Я пытаюсь удалить пробел в начале строки, у меня есть индекс первого символа без пробела, поэтому я попытался сделать это:

int firstNonWhitespace = ...;
char *line = ...;
char *realStart = line + firstNonWhiteSpace;
strcpy(line, realStart);

но получил Abort Trap 6 во время выполнения.

Однако это работает, если я скопирую строку realStart во временную строку, а затем скопирую временную строку в строку:

int firstNonWhitespace = ...;
char *line = ...;
char *realStart = line + firstNonWhiteSpace;
char *tstring = malloc(strlen(realStart) + 1);
strcpy(tstring, realStart);
strncpy(line, tstring, strlen(line));
free(tstring);

person Jonathan.    schedule 12.06.2014    source источник
comment
Для всех практических целей, разве вы не можете просто использовать realStart для ссылки на строку оттуда и далее?   -  person asb    schedule 12.06.2014
comment
Укажите по буквам char *line = ...; Что вы заменили на ...?   -  person jarmod    schedule 12.06.2014
comment
strcpy не любит перекрывающиеся строки. См. stackoverflow.com/questions/7427596/ для нескольких альтернатив.   -  person Jongware    schedule 12.06.2014


Ответы (3)


Есть две проблемы с вашим кодом.

  1. Источник и место назначения в вызове strcpy() действительно перекрываются, что приводит к неопределенному поведению.

  2. Вполне может быть, что realStart указывает на какую-то недоступную для записи область памяти.

person Roberto Reale    schedule 12.06.2014

Более быстрый способ

line += firstNonWhiteSpace;

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

person mvw    schedule 12.06.2014
comment
Но это не повлияет на строку после возврата функции. И в функцию не передается указатель на строку - person Jonathan.; 12.06.2014
comment
Какая функция? У меня нет хрустального шара, только те несколько строк, которые вы написали, и они мало что говорят о вашем окружении. - person mvw; 12.06.2014

Вероятно, ваша проблема заключается в том, что вам не разрешено изменять строковые литералы, т.е. е. код

int main() {
    int firstNonWhitespace = 3;
    char *line = "   foo";
    char *realStart = line + firstNonWhiteSpace;
    strcpy(line, realStart);
}

может работать или не работать в зависимости от того, защищена ли ваша платформа от изменения строкового литерала " foo". Сначала копирование строки требуется стандартом языка.

Кроме того, поскольку strcpy() не гарантирует правильную работу с перекрывающимися строками (хотя вам может повезти), используйте memmove() для перемещения.

person cmaster - reinstate monica    schedule 12.06.2014