2012-01-16 61 views
1

我需要标记c中的字符串。假设我有这样一个字符串 “product = c,author = dennis,category = programming”。Tokenize c中的字符串

我想只提取这些键值对之间的值。像

[c,dennis,programming]

我已经使用了与 “=” 标记化strtok的功能,我得到的值

[product,c,author,dennis,category,programming]

是否有任何内置的函数只能生成上面提到的值。

+3

Tokenize','然后用for循环获取'='后面的子字符串。 – 2012-01-16 12:19:27

回答

1

我能想到几个途径:

  • 首先记号化上,,然后分裂的=每个部分。
  • 找到第一个=,然后在,之后,并获取其中的单词。重复。
  • 如果总是有三个值,则可以使用sscanf读取值。
  • 您可以使用正则表达式库来解析字符串。
+1

有些迂腐,但是*找到第一个=,然后,在它之后,并且介于两者之间。重复*将错过最后一个值,因为没有尾随逗号。 – razlebe 2012-01-16 12:26:30

4

只是一个简单的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 

注意。我已经在字符串的结尾添加,

+0

他想要的价值不是名字,但非常好的解决方案,我给你一个提高评级。 – UnixShadow 2012-01-16 13:09:40

3

你可以直接跳过每秒令牌这样的:

#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; 
} 
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如何工作,您不能“嵌套”呼叫;也就是说,您不能标记第一个键值对,然后将其分割为键和值标记,然后获取下一个键值对。您必须标记所有键值对第一个,然后依次处理每个键值对。