2012-05-10 22 views
5

私は(ubuntu正確な)Linuxシステム上にあり、Cの文字列の先頭文字を取り除きたいと思っています。私の以前のインストールでは、 )が、私は(これは一般的な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; 
} 

はremoveTabを実行すると、私は

gcc -o removetab removetab.c 

を行う私は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によって指さstrcpyの関数コピーは指さ。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()を呼び出します。

関連する問題