6
#include <stdio.h>
#include <string.h>

int main() {

char *slogan = "together{kaliya} [namak]";
char *slow_gun = strdup(slogan);

char *token = strsep(&slow_gun, "{");

printf ("\n slow_gun: %s\n token: %s\n", slow_gun, token);

return 0;
}

私がそれを実行すると:

$ cc -o try try_strsep.c
$ ./try

 slow_gun: kaliya} [namak]
 token: together  

しかし、いつ、char *slogan を次のように変更します。

char *slogan = "kalia} [namak]";

同じプログラムを実行します。

$ vi try_strsep.c 
$ cc -o try try_strsep.c
$ ./try

 slow_gun: (null)
 token: kalia} [namak]

私の質問は、 strsep() を使用し、入力文字列に探しているパターンがない場合、 strsep() の戻り値が間違っているということです。strsep() がパターンを見つけられなかったかどうかを検証できる唯一の方法は、を確認することif (slow_gun == NUll)です。

私が持っていればchar *slogan = "together{"strsep正常に戻りますが、空白に戻ります ( tokennot )slow_gunnull

$ cc -o try try_strsep.c
$ ./try

 slow_gun: 
 token: together

この IF チェックを回避し、関数に依存して substr を返し、そこにない場合は return にする方法はありNULLますか?

4

3 に答える 3

13

いいえ、チェックを回避する方法はありませんslow_gun == NULL。の動作の説明は次のとおりです。strsep

char *strsep(char **stringp, const char *delim);

説明がの
場合、関数は戻り、他には何もしません。それ以外の場合、この関数は文字列内の最初のトークンを検索します。トークンは文字列内の記号で区切られます。このトークンは、区切り文字をヌルバイト()で上書きすることによって終了し、トークンを通過するように更新されます。区切り文字が見つからなかった場合、トークンは文字列全体と見なされ、作成されます。*stringpNULLstrsep()NULL*stringpdelim'\0'*stringp*stringp*stringpNULL

戻り
値このstrsep()関数は、トークンへのポインターを返します。つまり、元の値を返します*stringp

したがって、一致するものが見つからない場合はstrsep、元の文字列へのポインタを返し、slow_gun入力をNULLに設定します。

区切り文字が文字列の最後の文字である場合、その文字は「\ 0」で上書きさslow_gunれ、次の文字に設定されます。これは、元の文字列を終了する「\0」です。これが、printステートメントが空の文字列を出力する理由です。

誤って使用している場合、呼び出し元はその関数によって返されたポインターstrdupを呼び出す責任があります。free

于 2011-07-28T21:43:44.847 に答える
7

strsep() の戻り値が間違っています

それは正しくありません。 strsep()見つかった最初のトークンを返します。定義により、文字列の先頭が最初のトークンです。この場合、トークンを終了する区切り文字が見つからなかっただけです (したがって、文字列の残りはトークンです)。

strsep()「パターンを見つける」ために使用することを意図したものではありません。区切り文字のセットに基づいてトークンを分離するために使用されます。文字を検索する場合は、strchr()またはを使用しますstrpbrk()

于 2011-07-28T21:41:12.403 に答える
2

strsep は正しく動作しています - man ページから:

このstrsep()関数は、 によって参照される文字列*stringp内で、文字列 delim (または終了\0文字) 内の任意の文字が最初に出現する位置を特定し、それを\0. 区切り文字 (NULL文字列の末尾に達した場合は ) の後の次の文字の位置が に格納され*stringpます。の元の値 *stringpが返されます。

2 番目のケース正しいです。デリミタが見つからないため、最初のパラメータが指すように設定されNULL、元の文字列が返されます。あなたが言うように、if (slow_gun == NUll)これを検出するにはチェックする必要があります。

(ちなみに、これは変数名の選択がひどく紛らわしいです)。

于 2011-07-28T21:41:28.403 に答える