'&'
Cで文字列をトークンに分割する方法は?
質問する
21494 次
4 に答える
13
char *token;
char *state;
for (token = strtok_r(input, "&", &state);
token != NULL;
token = strtok_r(NULL, "&", &state))
{
...
}
于 2010-01-19T07:31:03.727 に答える
9
私はそれを次のようにします(を使用してstrchr()
):
#include <string.h>
char *data = "this&&that&other";
char *next;
char *curr = data;
while ((next = strchr(curr, '&')) != NULL) {
/* process curr to next-1 */
curr = next + 1;
}
/* process the remaining string (the last token) */
strchr(const char *s, int c)
の次の場所へのポインタを返します。または、c
で見つからない場合はを返します。s
NULL
c
s
あなたは使うことができるかもしれませんstrtok()
、しかし、私は好きではありませんstrtok()
、なぜなら:
- トークン化される文字列を変更するため、リテラル文字列では機能しないか、他の目的で文字列を保持する場合にはあまり役立ちません。その場合、最初に文字列を一時的なものにコピーする必要があります。
- 隣接する区切り文字をマージするため、文字列が
"a&&b&c"
、の場合、返されるトークンは、、、"a"
および"b"
です"c"
。の後に空のトークンがないことに注意してください"a"
。 - スレッドセーフではありません。
于 2010-01-19T07:34:45.013 に答える
2
以下の例に示すように、strok()関数を使用できます。
/// Function to parse a string in separate tokens
int parse_string(char pInputString[MAX_STRING_LENGTH],char *Delimiter,
char *pToken[MAX_TOKENS])
{
int i;
i = 0;
pToken[i] = strtok(pInputString, Delimiter);
i++;
while ((pToken[i] = strtok(NULL, Delimiter)) != NULL){
i++;
}
return i;
}
/// The array pTokens[] now contains the pointers to the start of each token in the (unchanged) original string.
sprintf(String,"Token1&Token2");
NrOfParameters = parse_string(String,"&",pTokens);
sprintf("%s, %s",pToken[0],pToken[1]);
于 2010-01-19T07:48:34.577 に答える
0
私にとって、strtok()
関数の使い方は直感的でなく、複雑すぎるので、なんとか自分で関数を作成することができました。引数として、分割する文字列、トークン間のスペースを決定する文字、および見つかったトークンの数を表すポインターを受け入れます(これらのトークンをループで出力する場合に便利です)。この関数の欠点は、各トークンの最大長が固定されていることです。
#include <stdlib.h>
#include <string.h>
#define MAX_WORD_LEN 32
char **txtspt(const char *text, char split_char, int *w_count)
{
if(strlen(text) <= 1)
return NULL;
char **cpy0 = NULL;
int i, j = 0, k = 0, words = 1;
//Words counting
for(i = 0; i < strlen(text); ++i)
{
if(text[i] == split_char && text[i + 1] != '\0')
{
++words;
}
}
//Memory reservation
cpy0 = (char **) malloc(strlen(text) * words);
for(i = 0; i < words; ++i)
{
cpy0[i] = (char *) malloc(MAX_WORD_LEN);
}
//Splitting
for(i = 0; i < strlen(text) + 1; ++i)
{
if(text[i] == split_char)
{
cpy0[k++][j] = '\0';
j = 0;
}
else
{
if(text[i] != '\n') //Helpful, when using fgets()
cpy0[k][j++] = text[i]; //function
}
}
*w_count = words;
return cpy0;
}
于 2021-09-23T12:15:44.543 に答える