2012-05-10 3 views
5

Я нахожусь на (ubuntu точной) Linux-системе, и я хочу удалить ведущие символы (табуляторы) из строки в C. Я думал, что следующий код работал над моей предыдущей установкой (ubuntu oneric), но я нашел теперь, что он больше не работает (обратите внимание, что это упрощенная версия кода для общего UTF-8 символов):Удалить символы из строки в стандарте 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; 
} 

Я

gcc -o removetab removetab.c 

При выполнении removetab I get

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

Обратите внимание на публикацию "=" и отсутствие "c"! Неправильно или как я могу достичь этого в качестве альтернативы. Код должен поддерживать строки UTF-8.

+1

Кстати, вы делаете много копий без всякой причины, делая этот алгоритм чем-то вроде O (N!) Для вещи, которая может быть O (N) с разумным алгоритмом. –

ответ

8
strcpy(my_char, my_char+1); 

strcpy строки не должны пересекаться.

От C Стандартный (курсив мой):

(C99, 7.21.2.3p2) «Функция зЬгсру копирует строку, указанную s2 (включая завершающий нулевой символ) в массив, адресуемый . от s1 Если копирование происходит между объектами, которые перекрывают друг друга, поведение не определено "

+0

странно, что он работал до ... – highsciguy

3

Если посмотреть на 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. 

Код вызывает strcpy() на том же массиве, что приводит к повреждению строки.

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