【问题标题】:Remove first few characters from a string从字符串中删除前几个字符
【发布时间】:2016-11-10 23:27:13
【问题描述】:

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

【问题讨论】:

  • “删除”是否意味着您还想释放内存?如果不是(而且它只是关于输出),你只需让你的指针指向新的开始,即 str += 3
  • @Ur Mom 你可以使用strlen吗?
  • 注意:在assert(n != 0 && str != 0)中看到不需要n != 0

标签: c arrays string memmove


【解决方案1】:

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

【讨论】:

  • 如果您不保存原始指针并且以后需要free 它可能会很危险。不过不管它是否在堆栈上。
  • @Cody 当然,你可以想出 1000 种在 C 语言中伤害自己的方法。严格来说,这是完成 OP 要求的最佳方法。
【解决方案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) 快捷方式。

【讨论】:

    【解决方案3】:

    这是一个不使用标准 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 )
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        不需要将字符的“数量”作为参数传递,可以搜索'\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;
        }
        

        【讨论】:

          猜你喜欢
          • 2021-01-21
          • 2012-08-02
          • 2016-02-11
          • 2017-09-09
          • 1970-01-01
          • 2011-07-05
          • 2011-11-03
          • 2011-09-18
          • 1970-01-01
          相关资源
          最近更新 更多