2012-05-10 18 views
5

Ich bin auf einem (Ubuntu präzise) Linux-System, und ich möchte führende Zeichen (Tabulatoren) aus einer Zeichenfolge in C entfernen. Ich dachte, der folgende Code wurde auf meiner vorherigen Installation (ubuntu oneric), aber ich fand jetzt, dass es nicht mehr funktioniert (beachten sie, dass diese für die allgemeine UTF-8-Zeichen) eine vereinfachte Version eines Codes ist:Entfernen Sie Zeichen aus der Zeichenfolge in Standard 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; 
} 

ich

gcc -o removetab removetab.c 

Bei der Ausführung RemoveTab I erhalten

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

Notiere die Vervielfältigung von "=" und die fehlende "c"! Was ist falsch oder wie kann ich dies alternativ erreichen. Der Code sollte UTF-8-Strings unterstützen.

+1

Übrigens, Sie machen viele Kopien aus keinem Grund, machen diesen Algorithmus etwas wie O (N!) Für ein Ding, das O (N) mit einem vernünftigen Algorithmus sein könnte. –

Antwort

8
strcpy(my_char, my_char+1); 

strcpy Saiten dürfen nicht überlappen.

Von der C-Standard (Hervorhebung von mir):

(C99, 7.21.2.3p2) „Die strcpy Funktion kopiert die Zeichenfolge von s2 zeigte (einschließlich des abschließenden Nullzeichen) in das Array, auf . von s1 Wenn das Kopieren erfolgt zwischen Objekten, die das Verhalten undefiniert überlappen "

+0

seltsam, dass es vorher gearbeitet ... – highsciguy

3

Wenn Sie man strcpy aussehen:.

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. 

Der Code ruft strcpy() auf dem gleichen Array, das auf String-Korruption führt.

Verwandte Themen