2014-10-21 8 views
1

У меня есть функция drop_left(), которая удаляет первые n символов из строки. Я увеличиваю указатель на n пробелов, чтобы строка указывала на все после первых n символов. Когда я вернусь к главному, функция фактически не изменила строку. Что я делаю не так?Как удалить первые n символов из строки в c?

int main(int argc, char** argv) { 
    char string[]="drop left"; 
    drop_left(string, 2); 
    printf("Drop left: %s\n" , string); 
} 

void drop_left(char *s, int n){ 
     s+=n; 
} 
+0

использования '' memmove' как символ * drop_left (символ * с, Int N) { возвратного memmove (S, S + N, STRLEN (ы + п) +1); } ' – BLUEPIXY

+0

Вы изменяете только локальный аргумент, а не переменную, переданную функции. – ApproachingDarknessFish

+0

изменяет его только внутри drop_left. Фактически вы не изменили точки «строки» местоположения, а только ее копию, которая была передана в качестве параметра. –

ответ

1

Когда вы меняете s в drop_left, вы меняете локальную переменную. Он не изменяется там, где указывает исходная строка в вызывающей функции.

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

void drop_left(char *s, int n) 
{ 
    char* s2 = s + n; 
    while (*s2) 
    { 
     *s = *s2; 
     ++s; 
     ++s2; 
    } 
    *s = '\0'; 
} 
3

Потому что вы изменяете s внутри вашей функции, которая не делает ничего для указателя на строку ВНЕ функции. Вам нужно будет return s внутри функции, затем string = drop_left(string, 2).

Обратите внимание, что это приведет к утечкам памяти. Ваш код просто заставляет C «забыть» о сброшенных символах, но они все равно будут использовать память и вызвать проблемы, если вы делаете то же самое в строках, для которых у вас есть malloc().

+2

+1 для утечки памяти ... неприятный материал, с которым вы никогда не захотите иметь дело с – Steve

+0

@Steve, не в показанном использовании; стек все еще владеет массивом char, и переназначение 'string' не будет выполнено. Однако я согласен с тем, что функциональный интерфейс будет плохой выбор в целом из-за неаккуратной семантики владения, с которой вы ссылаетесь. Опять же, 'strstr' работает одинаково. –

Смежные вопросы