2016-11-10 4 views
1

Мне нужно удалить первые 3 символа из массива без каких-либо библиотек. Как мне это сделать? Я знаю, что могу использовать memmove, но я работаю над системой без стандартной библиотеки, также memmove предназначен для указателей. С memmove я могу сделать this:Удалить первые несколько символов из строки

void chopN(char *str, size_t n) 
{ 
    assert(n != 0 && str != 0); 
    size_t len = strlen(str); 
    if (n > len) 
     return; // Or: n = len; 
    memmove(str, str+n, len - n + 1); 
} 

Но я мог удалить символы из массива без memmove или любых других стандартных функций библиотеки?

+0

«удалить» означает, что вы также хотите освободить память? если нет (и это только выход), вы просто указали бы свой указатель на новый старт, т. е. str + = 3 –

+1

@Ur Mom Можно ли использовать strlen? –

+0

Примечание: см. «N! = 0» в 'assert (n! = 0 && str! = 0)'. – chux

ответ

2

Пока вы знаете, что длина строки не менее 3 символов, вы можете просто использовать str + 3.

+1

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

+1

@Cody Конечно, вы могли бы придумать 1000 способов причинить себе боль в C. Строго говоря, это лучший способ выполнить то, что задал ОП. –

0

Вам не нужно пройти «количество» символов в качестве параметра, вы можете искать «\ 0»:

void chopN(char *str, size_t n){ 
    char *aux; 
    int i=0,j=0; 
    while(str[i]!='\0'){ 
     if(i>n+1){ 
      aux[j++]=str[i++]; 
     }else i++; 
    } 
    aux[j]='\0'; 
    str = aux; 
} 
1

Вот функция, которая не использует стандартные C строковые функции. n может быть меньше или равно strlen(s). В противном случае функция ничего не делает.

#include <stdio.h> 

char * chopN(char *s, size_t n) 
{ 
    char *src = s; 

    while (*src && n) --n, ++src; 

    if (n == 0 && src != s) 
    { 
     for (char *dst = s; ( *dst++ = *src++);); 
    } 

    return s; 
} 

int main(void) 
{ 
    char s[] = "Hello, World"; 

    puts(s); 
    puts(chopN(s, 7)); 

    return 0; 
} 

Выход программы

Hello, World 
World 

Если вы хотите, чтобы в случае, когда n больше strlen(s) все символы были удалены, то достаточно подставив если заявление

if (n == 0 && src != s) 

для этого

if (src != s) 
0

Просто начните с нового старта (ул + п) и копию старого запуска полукокса на гольца, пока не будет достигнут конец строки:

char *str1; 
for(str1 = str+n; *str1; *str++=*str1++) 
    ; 
*str = 0; 

Если вы хотите что-то более мощное, вы можете, например, украсть реализацию memmove от http://git.musl-libc.org/cgit/musl/tree/src/string/memmove.c (она в основном делает то же самое, кроме как с некоторыми улучшениями производительности и решение о том, каким путем (влево/вправо) ход идет).

2

Хммм: 2 простых цикла должны делать это.

Некоторые непроверенные коды, чтобы дать вам представление.

void chopN(char *str, size_t n) { 
    char *dest = str; 

    // find beginning watching out for rump `str` 
    while (*str && n--) { 
    str++; 
    } 

    // Copy byte by byte 
    while (*src) { 
    *dest++ = *src++; 
    } 

    *dest = '\0'; 
} 

удалось добавить if (n==0) укороченные при желании.

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