我需要标记c中的字符串。假设我有这样一个字符串 “product = c,author = dennis,category = programming”。Tokenize c中的字符串
我想只提取这些键值对之间的值。像
[c,dennis,programming]
。
我已经使用了与 “=” 标记化strtok的功能,我得到的值
[product,c,author,dennis,category,programming]
。
是否有任何内置的函数只能生成上面提到的值。
我需要标记c中的字符串。假设我有这样一个字符串 “product = c,author = dennis,category = programming”。Tokenize c中的字符串
我想只提取这些键值对之间的值。像
[c,dennis,programming]
。
我已经使用了与 “=” 标记化strtok的功能,我得到的值
[product,c,author,dennis,category,programming]
。
是否有任何内置的函数只能生成上面提到的值。
我能想到几个途径:
,
,然后分裂的=
每个部分。=
,然后在,
之后,并获取其中的单词。重复。有些迂腐,但是*找到第一个=,然后,在它之后,并且介于两者之间。重复*将错过最后一个值,因为没有尾随逗号。 – razlebe 2012-01-16 12:26:30
只是一个简单的scanf
#include<stdio.h>
int main()
{
char token[20] = { 0 };
char c, name[20];
int i=0, offset;
while (scanf("%[a-z]%*[^a-z]", token) == 1) {
i++;
if(i%2==0)
printf("[%s]\n",token);
}
return 0;
}
./a.out
product=c,author=dennis,category=programming,
[c]
[dennis]
[programming]
Ctrl+D
注意。我已经在字符串的结尾添加,
他想要的价值不是名字,但非常好的解决方案,我给你一个提高评级。 – UnixShadow 2012-01-16 13:09:40
你可以直接跳过每秒令牌这样的:
#include <stdio.h>
#include <string.h>
int main(void) {
char str[] = "product=c,author=dennis,category=programming";
char* p = strtok(str, ",=");
while (p != NULL) {
p = strtok(NULL, ",=");
if (p != NULL) {
printf("%s\n", p);
strtok(NULL, ",="); // skip this
}
}
return 0;
}
你可以先标记化上,
,内容分成3个不同的字符串,然后记号化的“ ='为每个字符串:
char *kvpair[N] = {NULL}; // where N is large enough for the expected
// number of key-value pairs
char *tok = strtok(input, ",");
size_t kvcount = 0;
while (tok != NULL && kvcount < N)
{
kvpair[kvcount++] = tok;
tok = strtok(NULL, ",");
}
...
for (i = 0; i < kvcount; i++)
{
char delim = '[';
char *key = strtok(kvpair[i], "=");
char *val = strtok(NULL, "=");
printf("%c%s", delim, val);
delim = ',';
}
putchar(']');
这只是一个粗略的草图;它假定提前知道键值对的最大数量,它不会尝试处理空键或值,或者根本不做任何类型的错误处理。但它应该指向正确的方向。
请记住,strok
修改其输入;如果您的原始数据是字符串文字,或者您需要保留原始数据,则需要复制并处理该副本。
请注意,由于strok
如何工作,您不能“嵌套”呼叫;也就是说,您不能标记第一个键值对,然后将其分割为键和值标记,然后获取下一个键值对。您必须标记所有键值对第一个,然后依次处理每个键值对。
Tokenize','然后用for循环获取'='后面的子字符串。 – 2012-01-16 12:19:27