1
Example Text: 

bclk = /gsrpkg_te/gsrpkg/gsrdie/xxBCLK

「strtok」について質問したいのですが、以下は私が直面したいくつかの疑問を含むコード例です。

char *p4;
char *p5;
p4 = strtok (eqvline, "=");
p5 = strtok (NULL, ":");
if ( !strcmp (p4, "bclk") ) {
   strcpy ( sa_de_bclk, p5 );
   printf ( "[vTPSim] ---> bclk = %s.\n", p5);
}

上記の例のテキストから、":"どこにも (コロン) はありません。私の理解でstrtok()は、定義されたシンボルが見つからない場合は結果として NULL が割り当てられます。

ただし、この場合、 がなく":"p5も の割り当てが残っているのはなぜですか"/gsrpkg_te/gsrpkg/gsrdie/xxBCLK"

助けてくれてありがとう。

4

3 に答える 3

5

定義されたシンボルがない場合の strtok の私の理解では、結果として NULL が割り当てられます

またはと混同strtok()している可能性があります。文字列の残りの部分に区切り記号が見つからない場合は、その残りの部分 (より正確には、最初の文字へのポインター) を返します。区切り文字がまったく見つからない場合は、文字列全体である可能性があります。ドキュメント。strchr()strstr()strtok()

嫌悪者と否定者向けのドキュメントからの引用:

そのようなバイトが見つからない場合、現在のトークンはs1 が指す文字列の末尾まで拡張され、その後のトークンの検索では null ポインターが返されます。

後続。それ以上の区切り文字を見つけることができなかった呼び出しではなく、それに続く呼び出しです。

于 2013-07-16T08:18:53.910 に答える
3

最初のパラメーターが NULL の場合、strtok は次のトークンを取得しようとします。最初の strtok 呼び出しはstrtok (eqvline, "=")and eqvline != NULLtoken =であったため、2 番目の呼び出しでは、例の/gsrpkg_te/gsrpkg/gsrdie/xxBCLKである次の部分が検出されます。

于 2013-07-16T08:20:36.767 に答える
0

おそらく、strtok http://www.cplusplus.com/reference/cstring/strtok/のこのドキュメントを読む必要があります。

char * strtok ( char * str, const char * delimiters );

この関数の一連の呼び出しにより、str がトークンに分割されます。トークンは、区切り記号の一部である任意の文字で区切られた連続した文字のシーケンスです。

最初の呼び出しでは、関数は str の引数として C 文字列を予期します。その最初の文字は、トークンをスキャンする開始位置として使用されます。後続の呼び出しでは、関数は null ポインターを予期し、最後のトークンの末尾の直後の位置をスキャンの新しい開始位置として使用します。

あなたの例を見ると、空白を区切り文字として定義していないため、p4には「bclk」ではなく「bclk」が含まれていると予想されます。ドキュメントによると、strtok の呼び出し間で区切り記号を変更したため、4 行目 (p5 = ...) で行ったことには定義された結果がありません。最初の区切り文字を使用することを期待しているため、「=」の後に残りの文字列を返します。それは何をしますか...

お役に立てれば

于 2013-07-16T08:28:50.040 に答える