2014-01-09 2 views
0

я должен создать очень недорогой алгоритм (процессор и память), чтобы удалить первый char из строки (массив символов) в С.Каков менее дорогой способ удаления символа с начала строки в C?

настоящее время я использую:

char *newvalue = strdup(value+1); 
free(value); 
value = newvalue; 

Но я хочу чтобы узнать, есть ли более дешевый способ сделать это. Строка value динамически распределена.

+0

Примечание: этот код имеет UB, если 'value' is" ". – chux

ответ

3

Повторно использовать исходный массив. Может или не может быть быстрее, зависит от относительной скорости выделения и копирования памяти (де).

int size = strlen(value); 
if (size > 0) memmove(value, value+1, size); 
+0

Это тоже очень хорошая идея. Тем не менее я бы рекомендовал 'const size_t size'. :) – unwind

5

value+1 - char*, которые представляют собой строку с удаленным первым символом. Это менее дорогой способ получить такую ​​строку.

При освобождении памяти вам нужно быть осторожным, чтобы освободить исходный указатель, а не сдвинутый.

+2

Только если обе строки должны быть неизменными. –

+0

@BlagovestBuyukliev correct – Olotiar

+2

@BlagovestBuyukliev: вопрос показывает, что исходная строка освобождается, поэтому она больше не нужна. Следовательно, нет необходимости, чтобы строка в 'value + 1' была неизменной; он может быть изменен по желанию, и эффект от исходной строки не имеет значения, поскольку исходная строка больше не будет использоваться. –

1

Поскольку кучи звонков будут довольно дорогими, очевидная оптимизация заключается в том, чтобы их избежать.

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

Что-то вроде:

typedef struct { 
    const char *chars; 
    size_t offset; 
} mystring; 

Тогда вы должны были бы разработать API для преобразования mystring * в символьный указатель, путем добавления смещения:

const char * mystring_get(const mystring *ms) 
{ 
    return ms->chars + ms->offset; 
} 

и конечно функцию создайте суффикс, где удаляется 1-й символ:

mystring mystring_tail(const mystring *ms) 
{ 
    const mystring suffix = { ms->chars, ms->offset + 1}; 

    return suffix; 
} 

обратите внимание, что mystring_tail() возвращает новую строковую структуру по значению, чтобы избежать распределения кучи.