5

私は (ubuntu の正確な) Linux システムを使用しており、C の文字列から先頭の文字 (タブレータ) を削除したいと考えています。以前のインストール (ubuntu oneric) では次のコードが機能していると思っていましたが、機能しないことがわかりました。もう (これは一般的な UTF-8 文字のコードの簡略化されたバージョンであることに注意してください):

#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 を実行すると、

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

「=」の重複と「c」の欠落に注意してください。何が問題なのか、またはこれを別の方法で達成するにはどうすればよいですか。コードは UTF-8 文字列をサポートする必要があります。

4

2 に答える 2

8
strcpy(my_char, my_char+1);

strcpy文字列が重なってはなりません。

C標準から(強調鉱山):

(C99、7.21.2.3p2) 「strcpy 関数は、s2 が指す文字列 (終端のヌル文字を含む) を、s1 が指す配列にコピーします。重複するオブジェクト間でコピーが行われる場合、動作は未定義です。

于 2012-05-10T21:28:11.847 に答える
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()れるため、文字列が破損します。

于 2012-05-10T21:31:25.183 に答える