【问题标题】:string parsing with strtok_r使用 strtok_r 解析字符串
【发布时间】:2011-10-23 09:04:50
【问题描述】:

我的字符串如下所示:

abcd "efgh [data\]" pqrl 12fgd]

我想解析直到没有反斜杠'\'的']'

我可以用strtok_r 做吗?如果不是那我应该怎么做?

【问题讨论】:

  • 那些愚蠢的“你试过什么”的cmets在哪里?

标签: c strtok string-parsing


【解决方案1】:

使用strtok_r 没有一种单一的方法可以做到这一点。由于您的分隔符是单个字符,如果strtok_r 返回的标记的最后一个字符是“\”,则您始终可以通过填充分隔符来重构您想要的字符串。

#include <stdio.h>
#include <string.h>

int main()
{
  char str[] = "abcd \"efgh [data\\]\" pqrl 12fgd]";
  char *tokens[2] = {0};
  char *pToken = str;
  unsigned int i = 0;

  for( tokens[i] = strtok_r( str, "]", &pToken ); ++i < 2; 
    tokens[i] = strtok_r( NULL, "]", &pToken ) ) {
  }

  for( i = 0; i < 2; ++i ) {
    printf( "token %d = %s\n", i, tokens[i] );
  }

  for( i = 0; i < 2; ++i ) {
    if( tokens[i][strlen(tokens[i]) - 1] == '\\' ) {
      tokens[i][strlen(tokens[i])] = ']';
    }
  }

  printf( "output = %s\n", str );

  return 0;
}

这个输出:

token 0 = abcd "efgh [data\
token 1 = " pqrl 12fgd
output = abcd "efgh [data\]" pqrl 12fgd

【讨论】:

    【解决方案2】:

    您可以使用strchr 来实现。以下是我尝试的方法(未经测试):

    p = str;
    while ((p = strchr(p, ']')) {
        if (p > str && *(p-1) != '\')
            /* This is it. */
    

    【讨论】:

      【解决方案3】:

      strtok 搜索要搜索的集合中的任何单个字符。您可以在 ] 上拆分,然后检查哪些前面有 \,但您无法使用它搜索正则表达式。

      【讨论】:

        猜你喜欢
        • 2012-08-06
        • 2011-10-14
        • 2011-07-14
        • 2020-04-11
        • 2021-07-25
        • 2014-07-01
        • 2021-09-26
        • 2018-11-07
        • 1970-01-01
        相关资源
        最近更新 更多