2012-05-10 24 views
5

Estoy en un sistema Linux (ubuntu preciso) y quiero eliminar los caracteres iniciales (tabuladores) de una cadena en C. Pensé que el siguiente código estaba funcionando en mi instalación anterior (ubuntu oneric) pero he encontrado ahora que ya no funciona (tenga en cuenta que esta es una versión simplificada de un código para general de caracteres UTF-8):Eliminar caracteres de la cadena en el estándar C

#include <math.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 

int main() 
{ 

    int nbytes = 10000; 
    char *my_line, *my_char; 

    my_line = (char *)malloc((nbytes + 1)*sizeof(char)); 

    strcpy(my_line,"\tinterface(quiet=true):"); 
    printf("MY_LINE_ORIG=%s\n",my_line); 

    while((my_char=strchr(my_line,9))!=NULL){ 
     strcpy(my_char, my_char+1); 
    } 
    printf("MY_LINE=%s\n",my_line); 

    return 0; 
} 

yo

gcc -o removetab removetab.c 

Al ejecutar removetab I obtener

MY_LINE_ORIG= interface(quiet=true): 
MY_LINE=interfae(quiet==true): 

¡Tenga en cuenta la publicación de "=" y la "c" faltante! ¿Qué está mal o cómo puedo lograrlo de forma alternativa? El código debería ser compatible con cadenas UTF-8.

+1

Por cierto, usted está haciendo muchas copias sin ninguna razón, por lo que este algoritmo es algo así como O (N!) Para algo que podría ser O (N) con un algoritmo razonable. –

Respuesta

8
strcpy(my_char, my_char+1); 

strcpy Las cadenas no deben superponerse.

Desde el C estándar (el énfasis es mío):

(C99, 7.21.2.3p2) "La función copia strcpy la cadena apuntada por s2 (incluyendo el carácter nulo de terminación) en la cadena apuntada . por s1 Si la copia se realiza entre los objetos que se superponen, el comportamiento es indefinido "

+0

extraño que funcionó antes ... – highsciguy

3

Si nos fijamos en man strcpy:.

DESCRIPTION 
The strcpy() function copies the string pointed to by src, including 
the terminating null byte ('\0'), to the buffer pointed to by dest. 
The strings may not overlap, and the destination string dest must be 
large enough to receive the copy. 

El código invoca strcpy() en la misma matriz que conduce a la corrupción de cadenas.

Cuestiones relacionadas