谁能帮帮我吗? 我需要从C中的char *
中删除第一个char *
。
例如, char * contents
包含一个'n'
字符作为数组中的第一个字符。 我需要检测并消除这个字符,在它被“消毒”后修改原始变量。
任何人都可以帮我代码吗? 我对C完全不熟悉,似乎无法弄明白。
if (contents[0] == 'n') memmove(contents, contents+1, strlen(contents));
或者,如果指针可以修改:
if (contents[0] == 'n') contents++;
char* contents_chopped = contents + 1;
这将导致contents_chopped
指向相同的字符串,除了第一个char将是 n之后的下一个字符
此外,这种方法更快。
如果你有malloc任何内存或你的程序将崩溃,不要只是递增指针。 free需要原始指针。 你可以复制指针,创建一大块内存并记忆它,以ptr + 1或任何其他方式访问它,但那些只是增加指针的人会给你危险的建议。 您可以运行此示例程序,看看当“只是递增指针”时会发生什么。
#include #include #include int main(void) { char *str = (char *)malloc(10); strcpy(str, "1234567890"); printf("%sn", str); str++; printf("%sn", 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
听起来好像你的印象是char *“包含”字符。 它不是。 它只指向 一个字节。 字符串的其余部分暗示由内存中的后续字节组成,直到下一个空字节。 (您还应该知道,虽然’char’数据类型是一个字节,但根据定义,它实际上不是一个字符 – 请注意Unicode – 并且字节也不一定是八位字节。)
char *也不是数组,尽管可能存在一个字符数组,使得指针指向该数组的开头。
#include #include int main () { char src[50] = "123456789123434567678"; char dest[16]={0}; memcpy(dest, src+1,sizeof(src)); printf("%sn",dest); return(0); } src+1 -> indicate how many char you want to remove
这是我的代码
char * bastakiniSil(char *contents){ char *p = malloc( sizeof(*p) * strlen(contents) ); int i; for(i=0; i
}
需要了解更多c/c++开发分享如何从C字符串中删除第一个字符?,也可以关注C/ C++技术分享栏目---计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享如何从C字符串中删除第一个字符?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/980398.html