前回書いた文字列を操作する関数をちょっと変えてみました。
変わったのは、文字列の長さ取得位置です。

/*!
 * @brief		バッファ内の特定の文字を削除します。
 * 
 * @param	         buff	文字列が格納されたバッファ
 * @param	         str	消去する文字
 *
 * @return	length	削除後の文字列の長さ
 */
size_t DeleteString( char *buff, const char *str )
{
    char    *pPoint;	// アドレス格納ポインタ
    size_t  length, strSize;	// バッファサイズ

    length = strlen( buff );
    strSize = strlen( str );   // 使いまわすのでここで計算

    /* 指定した文字列のアドレスを取得し、
     * 指定した文字列がなくなったらwhile()を抜ける
     */
    while( (pPoint = strstr( buff, str )) != NULL ){
 	buff = pPoint;		// アドレスコピー
	pPoint += strSize;		// 文字数分移動する
	strcpy( buff, pPoint );	// 文字列コピー
	length -= strSize;		// 減らした分、長さを減らす
    }

    return length;
}


この処理を図で説明すると、

'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' '\0'
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14

上記のような文字列があり、例えば'c'を消したいと思います。
この関数を使うと、

DeleteString( str, "c" );

まず、strstr( str, "c" );で"c"の位置を取得します。

ここでは2が返ってきます。
本当はメモリ上のアドレスが返ってくるので、0x********みたいのが返ってきますが、
今回は説明ということで省略。

pPointに2を格納します。
bufのアドレスをpPointに格納されているものに変更します。
そして、今回は1文字なので1つアドレスを変更します。→pPoint = 3;
最後に、strcpy()でコピーします。

つまり、
str

'c' 'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' '\0'
'd' 'e' 'f' 'g' 'h' 'i' 'j' 'k' 'l' 'm' 'n' '\0'

pPoint

こうして、"c"が消えたことになります。
説明が下手ですみませんT-T;