使用 strtok_r 进行字符串解析

发布于 2024-11-28 10:58:03 字数 160 浏览 2 评论 0原文

我的字符串看起来像这样:

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

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

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

my string looks like this:

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

I want to parse till ']' which is not proceeded by a backslash '\'

Can I do it with strtok_r? If not than how should I do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

悲凉≈ 2024-12-05 10:58:03

您可以使用 strchr 来完成此操作。这是我尝试执行的方法(未经测试):

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

You could do it with strchr. Here is how I would try to do it (untested):

p = str;
while ((p = strchr(p, ']')) {
    if (p > str && *(p-1) != '\')
        /* This is it. */
╰◇生如夏花灿烂 2024-12-05 10:58:03

没有一种单一的方法可以使用 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

There is no one shot method to doing this using strtok_r. Since your delimiter is a single character you can always reconstruct the string you want by stuffing back the delimiter if the last character of a token returned by strtok_r is '\'.

#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;
}

This outputs:

token 0 = abcd "efgh [data\
token 1 = " pqrl 12fgd
output = abcd "efgh [data\]" pqrl 12fgd
天荒地未老 2024-12-05 10:58:03

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

strtok searches for any single character in the set to be searched for. You could split on ] and then check which ones had a preceding \ but you can't search for a regex with it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文