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

时间:2016-11-10 23:27:13

标签: c arrays string memmove

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

5 个答案:

答案 0 :(得分:2)

只要您知道字符串长度至少为3个字符,您就可以使用str + 3

答案 1 :(得分:2)

嗯: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 = '\0';
}

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

答案 2 :(得分: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语句就足够了

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

这个

if ( src != s )

答案 3 :(得分: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;
}

答案 4 :(得分:0)

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

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

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