从字符串中删除前几个字符

Remove first few characters from a string

我需要从没有任何库的 数组 中删除前 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 或任何其他标准库函数的情况下从数组中删除字符吗?

只要知道字符串至少有3个字符长,就可以简单地使用str + 3.

不需要传"amount"个字符作为参数,可以搜索'\0':

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

这是一个不使用标准 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 语句就足够了

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

这个

if ( src != s )

只需从新的开始(str+n)开始,逐个字符复制到旧的开始字符,直到到达字符串的末尾:

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

如果你想要更强大的东西,你可以例如从 http://git.musl-libc.org/cgit/musl/tree/src/string/memmove.c 窃取一个 memmove 实现(它基本上做同样的事情,除了一些性能调整和决定使用哪种方式(left/right) 移动进行)。

嗯:2 个简单的 while 循环就可以做到。

一些未经测试的代码给你一个想法。

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 = '[=10=]';
}

如果需要,可以添加 if (n==0) 快捷方式。