【问题标题】:what can be used in C instead of istringstream(in case of C++) in case of parsing?在解析的情况下,可以在 C 中使用什么而不是 istringstream(在 C++ 的情况下)?
【发布时间】:2012-10-05 20:18:48
【问题描述】:

例如:

istringstream ss("hello hi here haha");
string p;
while (iss >> p)
{
    if (p == "hello")
        statement1;
    else if (p == hi)
        statement2;
}

这里使用了解析,那么 b 在 c 中可以使用什么来做到这一点?

【问题讨论】:

  • 如果我理解正确,strok。
  • @chris 你能把示例代码放到example..吗?
  • 如果你忽略了几个小的 C++ 元素,here's one。
  • 其实叫strtok。我认为@chris 只是打错了字。 Google 应该为您提供大量示例和文档。
  • @Code-Guru,谢谢,我没注意到。

标签: c++ c


【解决方案1】:

这是一个示例代码,将您的 sn-p 翻译成 C:

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

int main ()
{
  char s[] ="hello hi here haha";
  char *tok;
  char *last;
  tok = strtok_r(s, " ", &last);
  while (tok != NULL) {
    if(!strcmp(tok, "hello"))
      statement1;
    else if(!strcmp(tok, "hi"))
      statement2;
    tok = strtok_r(NULL, " ", &last);
  }
  return 0;
}

更新我按照 cmets 中 Adam Rosenfield 的建议将 strtok 的调用更改为 strtok_r。

【讨论】:

  • strcmp 成功返回 0。这不会按 OP 的预期工作。
  • @KingsIndian 谢谢。打字比我想象的要快 :) 已编辑。
  • 请记住,strtok 不是线程安全的或可重入的(在信号的情况下),因为它依赖于全局静态数据。在 POSIX 系统上,请考虑改用 strtok_r。
  • 还请解释一下 strtok 不是线程安全的怎么办?这意味着什么?
【解决方案2】:

如果您正在做一些不平凡的事情,请考虑使用flexand bison。

【讨论】:

    【解决方案3】:

    这样的?

    char* ss = "hello hi here hahah";
    
    int i=0;
    while (ss[i] != '\0')
    {
      while (ss[i] != ' ' && ss[i] != '\0')
        ++i;
    
      char* p[40];
      memcpy(p,ss,i);
    
      if (p == "hello")
        statement1;
      else if (p = "hi")
        statement2;
    }
    

    【讨论】:

    • 非常复杂。 strtok 是您所需要的。此外,p == "hello" 是一个指针比较。要比较字符串,请使用 strcmp
    猜你喜欢
    • 2012-06-02
    • 2010-09-16
    • 2011-03-11
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2012-03-11
    • 2016-09-25
    相关资源
    最近更新 更多