Cの部分文字列の文字列で読み取ったものをどのようにチェックしますか?
私が次のものを持っている場合
char name[21];
fgets(name, 21, stdin);
一連の部分文字列の文字列を確認するにはどうすればよいですか?
文字の前の部分文字列をどのようにチェックしますか? たとえば、=
記号の前の部分文字列をどのようにチェックするでしょうか?
注意してくださいstrtok()
。再入可能ではありません。とりわけ、ある関数でそれを呼び出してから別の関数を呼び出す必要があり、その他の関数も を使用している場合strtok()
、最初の関数がめちゃくちゃになることを意味します。また'\0'
、セパレーターの上に NUL ( ) バイトを書き込むため、入力文字列が変更されます。複数のターミネーター文字を探している場合、どの文字が見つかったかわかりません。さらに、他の人が使用するライブラリ関数を作成し、その関数が を使用している場合、関数の呼び出し元が、関数の呼び出し後に使用する独自のコードの失敗に困惑しないように、その事実を文書化strtok()
する必要strtok()
があります。言い換えれば、それは有毒です。関数が呼び出す場合strtok()
、一般に、関数を再利用できなくなります。同様に、使用するコードは、それを使用strtok()
する他の人の関数を呼び出すことはできません。
それでも機能のアイデアが好きな場合-一部の人はそうします(しかし、私はほとんど常にそれを避けます)-あなたのシステムで探しstrtok_r()
てください。再入可能です。strtok_r()
これは、関数に影響を与えることなく、他の関数が(または) を使用できることを意味する追加のパラメーターを取りstrtok()
ます。
適切と思われるさまざまな代替手段があります。考慮すべき明白なものはstrchr()
、strrchr()
、strpbrk()
、です。これらのどれも、分析する文字列を変更しませんstrspn()
。strcspn()
すべてが (そのままstrtok()
) 標準 C の一部であるため、基本的にどこでも使用できます。単一の文字が使用する必要があることを示唆する前に、素材を探しますstrchr()
。
strtok()を使用して、文字列をトークンに分割します。
char *pch;
pch = strtok (name,"=");
if (pch != NULL)
{
printf ("Substring: %s\n",pch);
}
. の後に呼び出しを続けstrtok()
て、さらに文字列を見つけることができます=
。
使用できますstrtok
が、再入可能ではなく、元の文字列を破棄します。調べる他の (おそらくより安全な) 関数はstrchr
、strstr
、 、strspn
、およびおそらくmem*
バリエーションです。一般に、私はstrn*
バリアントを避けています。なぜなら、バリアントは「境界チェック」を行いますが、依然として nul ターミネータに依存しているからです。有効な文字列がたまたま処理するのに予想していたよりも長くなった場合に失敗する可能性があり、バッファー サイズがわかっている場合を除き、実際にはバッファー オーバーランを防ぐことはできません。ターミネータを無視して、関数が機能するたびに、どのくらいのデータを処理しているかを正確に把握する方がよい (IMHO) mem*
。