谁能帮帮我吗?我需要从char *
C 中的 a 中删除第一个字符。
例如, 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
指向相同的字符串,除了第一个字符将是 \n 之后的下一个字符
此外,这种方法更快。
如果你有 malloc'd 任何内存,不要只增加指针,否则你的程序会崩溃。 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
听起来好像您的印象是 char* “包含”字符。它不是。它只是指向一个字节。字符串的其余部分暗示由内存中的后续字节组成,直到下一个空字节。(您还应该知道,虽然 'char' 数据类型是字节,但根据定义,它并不是真正的字符 - 请注意 Unicode - 字节也不一定是八位字节。)
char* 也不是一个数组,尽管可能存在一个字符数组,使得指针指向该数组的开头。
#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
如果它找到该字符,它基本上会忽略该字符并继续循环。
void remove_character(char* string, char letter) {
int length = strlen(string);
int found = 0;
for (int i = 0; i < length; ++i)
{
if (string[i] == letter)
{
found = 1;
continue;
}
if (found == 1)
{
string[i-1] = string[i];
}
}
if (found == 1)
{
string[length - 1] = '\0';
}
}
这是我的代码
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;
}
这是我的代码
如此简单
#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 表示要删除多少个字符。