usar una resueltos leer funciones eliminar ejercicios ejemplos como caracteres cadenas cadena arreglo c string cstring

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++;