1

我需要从没有任何库的数组中删除前 3 个字符。我该怎么做呢?我知道我可以使用memmove,但我正在一个没有标准库的系统上工作,也memmove适用于指针。我memmove可以这样

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

4

5 回答 5

2

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

于 2016-11-10T23:29:43.750 回答
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)快捷方式。

于 2016-11-10T23:49:27.003 回答
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 )
于 2016-11-10T23:45:05.917 回答
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;
}
于 2016-11-10T23:34:07.273 回答
0

只需从新的开始 (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 实现(它基本上做同样的事情,除了进行一些性能调整并决定移动的方式(左/右))。

于 2016-11-10T23:46:01.663 回答