una - funciones de cadenas de caracteres en c++
¿Cómo eliminar el primer carácter de la cadena C? (6)
Aqui esta mi codigo
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;
}
¿Alguien puede ayudarme por favor? Necesito quitar el primer carácter de un char *
en C.
Por ejemplo, el char * contents
contiene un carácter ''/n''
como primer carácter de la matriz. Necesito detectar y eliminar este carácter, modificando la variable original después de que haya sido "saneada".
¿Alguien puede ayudarme con el código? Soy completamente nuevo en C, y parece que no puedo resolverlo.
Suena como si tuviera la impresión de que un carácter * "contiene" caracteres. No es asi. Simplemente apunta a un byte. Se supone que el resto de la cadena consiste en el siguiente byte en la memoria hasta el siguiente byte nulo. (También debe tener en cuenta que aunque el tipo de datos ''char'' es un byte, por definición, en realidad no es un carácter, tenga en cuenta Unicode y que un byte no es necesariamente un octeto).
La char * tampoco es una matriz, aunque puede existir una matriz de caracteres tal que el puntero apunte al principio de esa matriz.
char* contents_chopped = contents + 1;
Esto hará que contents_chopped
apunte a la misma cadena, excepto que la primera char será la siguiente después de / n
Además, este método es más rápido.
No solo incremente el puntero si tiene una memoria malloc''d o su programa se bloqueará. Libre necesita el puntero original. Puede copiar el puntero, crear un nuevo trozo de memoria y memorizarlo, acceder a él como ptr + 1 o cualquiera de muchas otras formas, pero las personas que dicen simplemente incrementar el puntero le dan consejos peligrosos. Puede ejecutar este programa de ejemplo y ver qué sucede cuando "simplemente incrementa el puntero".
#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);
}
Pista: Aquí está el resultado:
[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
#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
if (contents[0] == ''/n'')
memmove(contents, contents+1, strlen(contents));
O, si se puede modificar el puntero:
if (contents[0] == ''/n'') contents++;