2012-03-06 3 views
4

文字列をトークンに分割しようとしていますが、やや再帰的です。私は解析しようとしています:sscanfを使用してC文字列をトークンに分割します。

"content=0&website=Google" 

私はパラメータと値を取り出す方法があります。私が試してみたらstrtok私は2回解析したい文字列を破壊してしまいます。だから私は再びargを解析することを望んで、最初のパスとして

char *contents = "content=0&website=Google" 
char arg[100]; 
char value[100]; 
sscanf(contents, "%s&%s", arg, value); 

を試してみましたが、それは失敗し、argは、文字列全体が含まれています。私は"%s\&%s"と思って&を予約しようとしましたが、運がありませんでした。

ヘルプ!

編集:

これは私はstrtokハックだった:

static void readParams(char * string, char * param, char * value) { 
    printf("This is the string %s\n",string); 
    char * splitted = strtok (string,"="); 

    while (splitted != NULL) 
    { 
     printf("This is the string %s\n",splitted); 
     splitted = strtok (NULL, "="); 
     // Then do some saving to param and value 
    } 
} 
char * splitted = strtok (contents,"&"); 
int counter = 0; 

while (splitted != NULL) 
{ 
    char * t_str = strdup(splitted); 
    readParams(t_str, param, value); 
    splitted = strtok (NULL, "&"); 
} 

が、分割さのstrtok終わりにはgobbldygookなるので、それは動作しません。

+2

あなたは 'はstrtok()'を呼び出す前に、だから、文字列のコピーを保存します。 – Duck

+0

'strchr()'を試すことができます。 –

+0

@ S.O users私はこれを知っていることがとても良い質問です。他の方法を予測することに加えて、誰かがなぜsscanf(内容、 "%s&%s"、arg、value)を理由づけた方が良いでしょう。 does not work –

答えて

1

scanfは、あなたが思っているよりも原始的です - %sは、次の空白まですべて一致します。あなたの最善の解決策はおそらくstrtokと固執しますが、それはあなたが正式なオリジナルからstrdupを編集した内容だけを投げることです。

+0

私は、分割のstrdupバージョンで渡す新しい関数にサブ解析を抽象化しようとすると、失敗します。どうしてこれなの?上記のコードを修正しました。 – Rio

0

私は次のようなものをお勧めします:ここで

char t_str[100]; 
strncpy(t_str, contents, 100); 
//now strtok() on t_str, original contents will be preserved 
8

が動作しているようなソリューションです:

char *contents = "content=0&website=Google"; 
char arg[100] = {0}; 
char value[100] = {0}; 
sscanf(contents, "%[^&]&%s", arg, value); 
printf("%s\n%s\n", arg, value); 
関連する問題