在c中标记字符串

在c中标记字符串,c,C,我需要用c来标记字符串。假设我有一根这样的线 “产品=c,作者=丹尼斯,类别=编程” 我只想提取这些键值对中的值。像 [c,丹尼斯,编程] 我使用了strtok函数,它用“=”标记,然后我得到值 [产品、c、作者、丹尼斯、类别、编程] 是否有任何内置函数只能生成上述值。我可以想出几种方法: 首先在,上标记,然后在=上拆分每个部分 找到第一个=,然后找到它后面的,,然后找到中间的单词。重复一遍 如果始终有三个值,则可以使用sscanf读取这些值 您可以使用正则表达式库来解析字符串 我可以想出两种

我需要用c来标记字符串。假设我有一根这样的线 “产品=c,作者=丹尼斯,类别=编程”

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

[c,丹尼斯,编程]

我使用了strtok函数,它用“=”标记,然后我得到值

[产品、c、作者、丹尼斯、类别、编程]


是否有任何内置函数只能生成上述值。

我可以想出几种方法:

  • 首先在
    上标记,然后在
    =
    上拆分每个部分
  • 找到第一个
    =
    ,然后找到它后面的
    ,然后找到中间的单词。重复一遍
  • 如果始终有三个值,则可以使用sscanf读取这些值
  • 您可以使用正则表达式库来解析字符串

    • 我可以想出两种方法:

      • 首先在
        上标记,然后在
        =
        上拆分每个部分
      • 找到第一个
        =
        ,然后找到它后面的
        ,然后找到中间的单词。重复一遍
      • 如果始终有三个值,则可以使用sscanf读取这些值
      • 您可以使用正则表达式库来解析字符串
        • 只是一个简单的扫描

          #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
          
          #包括
          int main()
          {
          字符标记[20]={0};
          字符c,名称[20];
          int i=0,偏移量;
          而(scanf(“%[a-z]]*[^a-z]”,令牌)==1){
          i++;
          如果(i%2==0)
          printf(“[%s]\n”,标记);
          }
          返回0;
          }
          /a.out
          product=c,author=dennis,category=programming,
          [丙]
          [丹尼斯]
          [编程]
          Ctrl+D
          
          注意。我在字符串末尾添加了

          只是一个简单的扫描

          #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
          
          #包括
          int main()
          {
          字符标记[20]={0};
          字符c,名称[20];
          int i=0,偏移量;
          而(scanf(“%[a-z]]*[^a-z]”,令牌)==1){
          i++;
          如果(i%2==0)
          printf(“[%s]\n”,标记);
          }
          返回0;
          }
          /a.out
          product=c,author=dennis,category=programming,
          [丙]
          [丹尼斯]
          [编程]
          Ctrl+D
          

          注意。我在字符串的末尾添加了

          您可以像这样跳过每一秒标记:

          #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;
          }
          
          #包括
          #包括
          内部主(空){
          char str[]=“产品=c,作者=丹尼斯,类别=编程”;
          char*p=strtok(str,“,=”);
          while(p!=NULL){
          p=strtok(空,“,=”);
          如果(p!=NULL){
          printf(“%s\n”,p);
          strtok(NULL,=”;//跳过此操作
          }
          }
          返回0;
          }
          
          您可以像这样跳过每一秒标记:

          #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;
          }
          
          #包括
          #包括
          内部主(空){
          char str[]=“产品=c,作者=丹尼斯,类别=编程”;
          char*p=strtok(str,“,=”);
          while(p!=NULL){
          p=strtok(空,“,=”);
          如果(p!=NULL){
          printf(“%s\n”,p);
          strtok(NULL,=”;//跳过此操作
          }
          }
          返回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(']');
          
          char*kvpair[N]={NULL};//其中,N足够大,以满足预期的
          //键值对的数目
          char*tok=strtok(输入“,”);
          大小\u t kvcount=0;
          while(tok!=NULL&&kvcount
          这只是一个粗略的草图;它假定提前知道最大的键值对数,它不会尝试处理空键或值,也不会真正进行任何类型的错误处理。但它应该为你指明正确的方向

          记住,
          strok
          修改其输入;如果原始数据是字符串文字,或者需要保留原始数据,则需要制作副本并处理该副本


          注意,由于strok的工作方式,您不能“嵌套”调用;也就是说,您不能将第一个键值对标记化,然后将其拆分为键值标记,然后获取下一个键值对。您必须首先标记所有键值对,然后依次处理每个键值对

          您可以首先在
          上标记,将内容拆分为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(']');
          
          char*kvpair[N]={NULL};//其中,N足够大,以满足预期的
          //键值对的数目
          char*tok=strtok(输入“,”);
          大小\u t kvcount=0;
          while(tok!=NULL&&kvcount
          这只是一个粗略的草图;它假定提前知道最大的键值对数,它不会尝试处理空键或值,也不会真正进行任何类型的错误处理。但它应该为你指明正确的方向

          记住,
          strok
          修改其输入;如果原始数据是字符串文字,或者需要保留原始数据,则需要制作副本并处理该副本


          注意,由于strok的工作方式,您不能“嵌套”调用;也就是说,您不能将第一个键值对标记化,然后将其拆分为键值标记,然后获取下一个键值对。您必须首先标记所有键值对,然后依次处理每个键值对

          标记化,然后使用for循环,得到
          =
          后面的子字符串。将
          标记化,然后使用for循环,得到
          =
          后面的子字符串。有点迂腐,但是找到第一个=,然后找到后面的,然后得到wo