代码之家  ›  专栏  ›  技术社区  ›  Ash

如何从C字符串中删除第一个字符?

  •  20
  • Ash  · 技术社区  · 15 年前

    有人能帮我吗?我需要从 char * 在C。

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

    有人能帮我写密码吗?我对C完全不熟悉,只是好像想不通。

    6 回复  |  直到 13 年前
        1
  •  54
  •   ruslik    15 年前
    if (contents[0] == '\n') 
        memmove(contents, contents+1, strlen(contents));
    

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

    if (contents[0] == '\n') contents++;
    
        2
  •  21
  •   user500944user500944    15 年前

    char* contents_chopped = contents + 1;

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

    而且,这种方法更快。

        3
  •  13
  •   mfisch    15 年前

    如果您有malloc的任何内存,不要仅仅增加指针,否则您的程序将崩溃。 free需要原始指针。你可以复制指针,创建一个新的内存块并将其存储起来,以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
    
        4
  •  3
  •   Karl Knechtel    15 年前

    听起来你好像觉得char*“包含”字符。不是的。只是 点数 在 一 字节。字符串的其余部分由内存中的后续字节组成,直到下一个空字节。(您还应该注意,虽然“char”数据类型是一个字节,但根据定义,它不是真正的字符—请注意Unicode—字节也不一定是一个八位字节。)

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

        5
  •  2
  •   deepak kumar Pranjay    8 年前
    #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
    
        6
  •  -1
  •   Samir    8 年前

    这是我的密码

    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;
    

    }

    推荐文章