2016-07-09 24 views
0

ポインタポインタchar(char **str)から文字列を削除しようとしていますが、私の関数は文字列を削除して残りの文字列を複製します。Cのポインタポインタcharから文字列を削除する

void remove_dup(char **split, char *name) 
{ 
    char **sp; 
    sp = split; 
    while (*sp != NULL) 
    { 
     if (strncmp(*sp, name, strlen(name)) == 0) 
     { 
      *sp = *(sp + 1); 
      sp++; 
     } 
     else 
      sp++; 
    } 
} 

complete code

+0

リンクに「working example」と表示されていますか?あなたの質問は何ですか? –

+0

コードの例、重複あり。重複を削除したい –

+2

重複を削除するようなことはありません。あなたの関数は、 'name'のすべてのインスタンスをリストから削除するように見えます。 – melpomene

答えて

3

1つの文字列をスキップすることはできません。読んだ文字列と未読の文字列を記録しておく必要があります。重複したエントリが適切に削除される場合

は、これは、重複したエントリ

void remove_dup(char **split, char *name) 
    { 
     char **read,**write; 
     read=write=split; 
     char count=0; 
     while (*read!=NULL){ 
      if (strncmp(*read, name, strlen(name)) == 0){ 
       if(count==0){ 
        *(write++)=*(read++); 
        count=1; 
       } 
       else{ 
        //free string 
        read++; 
        continue; 
       } 
      } 
      else 
       *(write++)=*(read++); 
     } 
     *write=0; 
    } 

を削除します、文字列が適切に解放しなければなりません。できるように文字列を初期化した方法を変更する必要があります。

+0

また、文字列へのポインタの配列が初期化されたため、文字列を解放する必要はありませんでしたが、配列が動的に割り当てられた文字列で初期化されていれば、リークを避けるためにもはや参照されていないメモリを解放するための戦略である必要があります。 –

関連する問題