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

Ash*_*Ash 21 c string cstring

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

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

任何人都可以帮我代码吗?我对C完全不熟悉,似乎无法弄明白.

rus*_*lik 54

if (contents[0] == '\n') 
    memmove(contents, contents+1, strlen(contents));
Run Code Online (Sandbox Code Playgroud)

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

if (contents[0] == '\n') contents++;
Run Code Online (Sandbox Code Playgroud)

  • 并注意你需要使用`memmove`,而不是'memcpy`,因为`memmove`需要正确处理重叠的源/目的地. (3认同)
  • 另请注意,如果使用`++`版本,那么如果尝试释放递增的指针,程序将崩溃.在这种情况下使用@Grigory suggerstion.此外,在短字符串上,由于初始化成本的原因,`memmove`的执行速度可能比简单循环慢. (3认同)
  • 啊,这就是strings.h 中的'mem' 函数所做的,很酷。第一个建议非常有效! (2认同)

小智 21

char* contents_chopped = contents + 1;

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

此外,这种方法更快.


mfi*_*sch 13

如果你有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);
}
Run Code Online (Sandbox Code Playgroud)

提示:结果如下:

[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
Run Code Online (Sandbox Code Playgroud)

  • 好的,现在发生在我身上,因为我使用的是增量方法,我也看到了与你在这里显示的类似的错误.这个答案的唯一问题是没有代码解决方案. (3认同)