2010-11-28 1 views
13

Может ли кто-нибудь мне помочь? Мне нужно удалить первый символ из char * в C.Как удалить первый символ из C-строки?

Например, char * contents содержит символ '\n' в качестве первого символа в массиве. Мне нужно обнаружить и устранить этот символ, изменив исходную переменную после ее «дезинфекции».

Может ли кто-нибудь помочь мне с кодом? Я совершенно не знаком с C, и просто не могу понять это.

+1

Для C новичка, это очень полезно прочитать о ` указатель арифметики`. Google термин, вы получите много хитов. Это поможет понять, что здесь говорят другие. Например: `char * contents_chopped = contents + 1;`. – biocyberman 2014-06-03 08:51:49

ответ

41
if (contents[0] == '\n') 
    memmove(contents, contents+1, strlen(contents)); 

Или, если указатель может быть изменен:

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

+1 избили меня. – 2010-11-28 07:03:00

+1

ahh, вот что делают функции «mem» в strings.h. Это первое предложение работает отлично! – Ash 2010-11-28 07:03:48

+3

и обратите внимание, что вам нужно использовать `memmove`, а не` memcpy`, потому что `memmove` требуется для правильной обработки перекрытия источника/адресата. – 2010-11-28 07:14:40

19

char* contents_chopped = contents + 1;

Это приведет к contents_chopped указывая на ту же строку, за исключением первого символа будет следующим после \ п

Кроме того, этот метод выполняется быстрее.

3

Звучит так, как будто у вас создается впечатление, что символ char * "содержит". Это не. Это всего лишь баллов по адресу a байт. Остальная часть строки подразумевается состоящей из последующего байта в памяти вплоть до следующего нулевого байта. (Вы также должны знать, что, хотя тип данных «char» является байтом, по определению, он не является символом - будьте внимательны к Unicode - и не обязательно байтом обязательно октетом.)

Char * также не является массивом, хотя может существовать массив символов, так что указатель указывает на начало этого массива.

13

Не увеличивайте указатель, только если у вас есть память malloc или какая-либо программа сработает. бесплатно требуется исходный указатель. Вы можете скопировать указатель, создать новый кусок памяти и 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); 
} 

Подсказка: Вот результат:

[[email protected] ~]$ ./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 
-1

Вот мой код

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; 

}

 Смежные вопросы

  • Нет связанных вопросов^_^