2012-05-10 5 views
5

Jestem na (ubuntu precise) systemie Linux i chcę usunąć znaki wiodące (tabulatory) z ciągu w C. Myślałem, że poniższy kod działał na mojej poprzedniej instalacji (ubuntu oneric), ale uważam, że teraz to już nie działa (należy pamiętać, że jest to uproszczona wersja kodu dla ogólnego UTF-8 znaków):Usuń znaki z ciągu znaków w standardowym 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; 
} 

mam

gcc -o removetab removetab.c 

Podczas wykonywania removeTab I uzyskaj

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

Uwaga na publikację "=" i brakującą literę "c"! Co jest nie tak i jak mogę to osiągnąć alternatywnie. Kod powinien obsługiwać ciągi znaków UTF-8.

+1

Nawiasem mówiąc, robisz dużo kopii bez powodu, czyniąc ten algorytm czymś w rodzaju O (N!) Dla rzeczy, która może być O (N) z rozsądnym algorytmem. –

Odpowiedz

8

strcpy ciągi nie mogą nakładać się.

Od C Standard (Kopalnia nacisk):

(C99, 7.21.2.3p2) „funkcja strcpy kopiuje łańcuch wskazywany przez s2 (łącznie z kończącym znakiem null) do tablicy wskazywanej . przez s1 Jeśli kopiowanie odbywa się między obiektami, które zachodzą na siebie, zachowanie jest niezdefiniowane "

+0

Dziwne, że działało wcześniej ... – highsciguy

3

Jeśli spojrzeć na 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. 

Kod wywołuje strcpy() w tej samej tablicy, co prowadzi do uszkodzenia łańcucha.