【问题标题】:How to remove first character from C-string?如何从 C 字符串中删除第一个字符?
【发布时间】:2011-05-16 19:05:53
【问题描述】:

谁能帮帮我?我需要从 C 中的 char * 中删除第一个字符。

例如,char * contents 包含一个 '\n' 字符作为数组中的第一个字符。我需要检测并消除这个字符,在“清理”后修改原始变量。

谁能帮我写代码?我对 C 完全陌生,但似乎无法弄清楚。

【问题讨论】:

  • 对于 C 新手来说,阅读 pointer arithmetic 是非常有益的。谷歌这个词,你会得到很多点击。这将有助于理解其他人在这里谈论的内容。例如:char* contents_chopped = contents + 1;.

标签: c string cstring


【解决方案1】:
if (contents[0] == '\n') 
    memmove(contents, contents+1, strlen(contents));

或者,如果指针可以修改:

if (contents[0] == '\n') contents++;

【讨论】:

  • 啊,这就是strings.h中'mem'函数的作用。第一个建议非常有效!
  • 并注意您需要使用memmove,而不是memcpy,因为需要memmove 才能正确处理重叠的源/目标。
  • 还要注意,如果你使用++版本,那么如果你试图释放递增的指针,程序将会崩溃。在这种情况下使用@Grigory 建议。此外,在短字符串上,memmove 由于其初始化成本,其执行速度可能比简单循环慢。
【解决方案2】:

char* contents_chopped = contents + 1;

这将导致contents_chopped指向同一个字符串,除了第一个字符将是\n之后的下一个字符

而且,这种方法更快。

【讨论】:

  • 必须注意指针的有效性将取决于contents 的有效性,所以如果您只想对contents_chopped 进行一些快速处理,这很好。还需要检查空字符串。
  • +1 给出了任何实际代码都应该使用的答案。复制/移动整个字符串只是为了利用它的尾巴是一种荒谬的浪费时间,但可悲的是,实际上有很多程序可以做这样的事情......
  • 我喜欢它的简单性,但你不能释放 contents_chopped,因为它需要它。
【解决方案3】:

听起来好像您认为 char* “包含”字符。它不是。它只是指向 一个字节。字符串的其余部分暗示由内存中的后续字节组成,直到下一个空字节。 (您还应该知道,虽然 'char' 数据类型是字节,但根据定义,它并不是真正的字符 - 请注意 Unicode - 字节也不一定是八位字节。)

char* 也不是一个数组,尽管可能存在一个字符数组,因此指针指向该数组的开头。

【讨论】:

    【解决方案4】:

    如果你有 malloc 的内存,不要只增加指针,否则你的程序会崩溃。 free 需要原始指针。您可以复制指针,创建一个新的内存块并对其进行 memcpy,以 ptr+1 或任何其他方式访问它,但是说只是增加指针的人会给您危险的建议。你可以运行这个示例程序,看看当你“只增加指针”时会发生什么。

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    int main(void)
    {
        char *str = (char *)malloc(10);
        strcpy(str, "1234567890");
        printf("%s\n", str);
        str++;
        printf("%s\n", str);
        free(str);
    }
    

    提示:结果如下:

    [mfisch@toaster ~]$ ./foo
    1234567890
    234567890
    *** glibc detected *** ./foo: free(): invalid pointer: 0x08c65009 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x724591]
    /lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0x725de8]
    /lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x728ecd]
    ./foo[0x80484e3]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x6cfbd6]
    ./foo[0x80483f1]
    ======= Memory map: ========
    001c9000-001e4000 r-xp 00000000 08:01 2883609    /lib/ld-2.11.1.so
    001e4000-001e5000 r--p 0001a000 08:01 2883609    /lib/ld-2.11.1.so
    001e5000-001e6000 rw-p 0001b000 08:01 2883609    /lib/ld-2.11.1.so
    006b9000-0080c000 r-xp 00000000 08:01 3015690    /lib/tls/i686/cmov/libc-2.11.1.so
    0080c000-0080d000 ---p 00153000 08:01 3015690    /lib/tls/i686/cmov/libc-2.11.1.so
    0080d000-0080f000 r--p 00153000 08:01 3015690    /lib/tls/i686/cmov/libc-2.11.1.so
    0080f000-00810000 rw-p 00155000 08:01 3015690    /lib/tls/i686/cmov/libc-2.11.1.so
    00810000-00813000 rw-p 00000000 00:00 0
    00e4d000-00e4e000 r-xp 00000000 00:00 0          [vdso]
    00fe0000-00ffd000 r-xp 00000000 08:01 2883667    /lib/libgcc_s.so.1
    00ffd000-00ffe000 r--p 0001c000 08:01 2883667    /lib/libgcc_s.so.1
    00ffe000-00fff000 rw-p 0001d000 08:01 2883667    /lib/libgcc_s.so.1
    08048000-08049000 r-xp 00000000 08:01 9700477    /home/mfisch/foo
    08049000-0804a000 r--p 00000000 08:01 9700477    /home/mfisch/foo
    0804a000-0804b000 rw-p 00001000 08:01 9700477    /home/mfisch/foo
    08c65000-08c86000 rw-p 00000000 00:00 0          [heap]
    b7600000-b7621000 rw-p 00000000 00:00 0
    b7621000-b7700000 ---p 00000000 00:00 0
    b776f000-b7770000 rw-p 00000000 00:00 0
    b7780000-b7783000 rw-p 00000000 00:00 0
    bfc22000-bfc37000 rw-p 00000000 00:00 0          [stack]
    Aborted
    

    【讨论】:

    • 好点,这发生在我身上,因为我使用的是增量方法,我也看到了与您在此处显示的类似的错误。这个答案的唯一问题是没有代码解决方案。
    【解决方案5】:

    这是我的代码

    char  * bastakiniSil(char *contents){
    char *p = malloc( sizeof(*p) * strlen(contents) );
    int i;
    for(i=0; i<strlen(contents); i++)
    {
        p[i]=contents[i+1];
    }
    
    return p;
    

    }

    【讨论】:

      【解决方案6】:
      #include <stdio.h>
      #include <string.h>
      
      int main ()
       {
      char src[50] = "123456789123434567678";
      
      char dest[16]={0};
       memcpy(dest, src+1,sizeof(src));
       printf("%s\n",dest);
       return(0);
      }
      
      src+1 -> indicate how many char you want to remove
      

      【讨论】:

        【解决方案7】:

        这是我的代码
        这么简单

        #include <stdio.h>
        #include<stdlib.h>
        int main()
        {
            char *str=(char *)malloc(100*sizeof(char));
            scanf("%s",str);
            str=&str[1];
            printf("%s",str);
            return 0;
        }
        

        str=&str[1] //这里的1表示要删除多少个字符。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多