2011-07-28 12 views
2
#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; 
} 

その代替:strsep()の使用と、私はそれを実行

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

slow_gun: kaliya} [namak] 
token: together 

しかし、私がするchar *スローガンを変更:

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が正常に

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

slow_gun: 
token: together 

は、私は、このIFチェックを回避し、私にSUBSTRを返すために、機能に頼ることができる方法はありtokenを返すが、(nullない)空白にslow_gunを返しますそれがなければ、NULLを返しますか?

+0

'strdup'によって返された文字列を' free'する必要があります。 – Praetorian

+0

@Praetorian:あなたは私を涙にしました。私はあなたに同意するが、それは私の質問で私を助けるつもりですか? – hari

+1

誰かがメモリリークを避けるのを助けることは常に助けになります:-)私の答えはあなたの質問に役立ちます。 – Praetorian

答えて

7

いいえ、チェックを避ける方法はありませんslow_gun == NULLstrsepの行動のHere's a description:stringpがNULLである

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

説明 *場合、strsep()関数は、NULL を返し、他に何もしません。それ以外の場合、この関数は文字列* stringpの最初のトークン を検索します。ここで、トークンは 文字列区切りの記号で区切られています。このトークンは、 '\ 0'文字(デリミタを上書きする によって)で終了し、* stringpは トークンを指すように更新されます。デリミタが見つからない場合、トークンは 文字列全体* stringpになり、* stringpはNULLになります。

戻り値 strsep()関数は、それが * stringpの元の値を返し、すなわち、トークンへのポインタを返します。

だから

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

区切り文字が文字列の最後の文字の場合、その文字は '\ 0'で上書きされ、slow_gunは次の文字に設定されます。元の文字列を終了するのは '\ 0'です。これはprint文が空文字列を出力する理由です。あなたは間違ってstrdupを使用している

NOTEは、呼び出し側はその関数によって返されたポインタにfreeを呼び出すための責任があります。

5

strsepのリターンは、()、右はないこと

間違っています。 strsep()は、見つかった最初のトークンを返します。文字列の先頭は、最初のトークンです。この場合、トークンを終了するための区切り文字が見つからない(文字列の残りの部分がトークンである)ためです。

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

1

strsepが正しく動作している - man pageから:

strsep()関数が位置、*stringpで参照ストリング、 列DELIMの任意の文字(または 終端\0文字)の最初の発生に\0に置き換えます。区切り文字の後ろの の次の文字の位置(または の末尾がNULLの場合)は、*stringpに格納されます。元の値は *stringpです。

第二ケース正しい - 区切り文字が最初のパラメータはNULLを指すように設定され、元の文字列が返され見つからないからです。あなたが言うように、これを検出するにはif (slow_gun == NUll)を確認する必要があります。

(これはひどく混乱する変数名です)。

関連する問題