質問
私は自分の版strtok.での練習のポインタ.
誰でもできるのでは限界がこんなこともできます。
void stvstrtok(const char *source, char *dest, const char token)
{
/* Search for the token. */
int i = 0;
while(*source)
{
*dest++ = *source++;
if(*source == token)
{
source++;
}
}
*dest++ = '\0';
}
int main(void)
{
char *long_name = "dog,sat ,on ,the,rug,in ,front,of,the,fire";
char buffer[sizeof(long_name)/sizeof(*long_name)];
stvstrtok(long_name, buffer, ',');
printf("buffer: %s\n", buffer);
getchar();
return 0;
}
解決
注:言葉のトークンは、他に使用中の一般用のパーツに文字列が返されます。区切り文字が記述されていることを分離するトークンなおコードをより明確にすべき変更のトークンを区切り文字と名前の変更destにtoken_dest.
の違いをごstrtok関数:
が違機能strtok.
- う機能は単に削除するトークンのセパレータ
- きのみお電話でのご機能を一度に処理すべての部分の文字列になります。とstrtokまで複数回のそれぞれの部分に対して文字列(その後の時代としてNULLに初param).
- strtokを破壊のソース文字列は、コードを使って自分のバッファと思いようご自身のバッファとしてきていた)。
- strtok店舗の位置の次のトークンが話後に最初のパラメータがNULLになります。この位置はその使用後に発信します。このスレッドに対して安全で、機能するスレッドで安全です。
- strtokが複数の異なる区切り文字は、コード用です。
とはいえ、いように"こういう機能ではなく、機能づくりを進めていstrtokの実施。
を改善するための機能なエstrtok):
ていただきたいと思いますよう、以下の変更
- ての機能だけを返し、"次へ"のトークン
- レイヤーでループす*ソース-ソ==区切り文字
- 返すポインタの最初の文字のソース文字列が含まれる次のトークンである。このポインタが使用でき続されます。
他のヒント
このコードは、すべてstrtok()
のように機能しません。あなたは何を正確に、やろうとしたのですか?しかし、これまでの改良として、あなたのコードは、重大なバグがありますsource
の出現数を差し引いtoken
の長さは、あなたがあなた自身を持っているdest
の長さよりも大きい場合は非常に古典的なのスタックオーバーフローの、現時点では私にはやや皮肉思われます。これは、あなたが使用したmain
に起こるが、他の場所の機能を使用すると、不確実性と絶望の脱落のパスにあなたを導くためにバインドされません。
はstrtokを使用すると、すべてのトークンを反復処理することができます。これは、元の文字列が書き込み可能であると仮定し、トークン区切りでそれにヌルを挿入することでこれを行います。宛先バッファは、ソースバッファwithing文字オフセットへのポインタです。あなたはまた、呼び出し間で「状態」を保つエンド+に達したときを知るためにこの事実を使用することができます。
それは元の文字列を破壊するため、はstrtokは、使用することをお機能ではありません。これは、再入もありません。
はstrtok()を使用すると、複数のトークンを取得するために複数回それを呼び出すことができますので、いくつかの状態を保存します。あなたが複数の宛先の文字列を取得しても、はstrtok()は「スプリット」は、元の文字列は、それぞれがトークンされます。
あなたのすべてのコードは、私が見たものから、トークン区切り文字に等しい任意の入力文字を無視して、ソースのNULL終端にコピーし続けているんます。
編集:さらに、2つのシーケンシングトークン-seperatorsがあります考えてみます。)最初は、あなたの関数では無視され、第二は、はstrtok(一方で、先に書き込まれますがシングルとして2つの以上の区切り文字のseqeunceを定義します区切り文字(manページ: http://man.cx/?page=strtokする)
はstrtokは、それが一種の敵対的になりNUL文字と入力文字列を破棄します。
あなたは区切り文字である「」もあれば、その文字列の撤退はstrtokますどのように多くのトークン「XYZ ,, PDQ」のケースを検討する必要があります。
あなたの関数が、この場合にはどのように過ごしたいですか?
また、はstrtok(...)は、複数の区切り文字をサポートしています。彼らはstrtokは(...)を再実装するために使用することができますよう、(...)strspn(...)とstrcspnの定義に見ます。
ところで、LONG_NAMEはcharへのポインタおよびsizeof(LONG_NAMEは)はsizeof(チャー*)です。 どのようなLONG_NAMEポイントのないサイズます。