【问题标题】:Split string by delimiter strtok weird behaviour通过分隔符 strtok 奇怪的行为拆分字符串
【发布时间】:2015-12-15 21:37:56
【问题描述】:

我正在尝试拆分字符串,但不幸的是 strtok 行为怪异

我有以下字符串 get|user=password|23|info|hello 我已经尝试过使用 strtok 的广泛使用的方法,但不幸的是它将 = 视为分隔符,我无法解析我的字符串。 所以get 解析正确比只解析user,但不是user=password

请帮助找出问题或提出任何其他拆分字符串的方法。 我正在为 Arduino 编程。

谢谢

代码

  const char delimeter = '|';
  char *token;
  token = strtok(requestString, &delimeter);
  // Handle parsed  
  token = strtok(NULL, &delimeter);

【问题讨论】:

  • 尝试使用字符串文字作为分隔符,而不是单独的、未分隔的char。我还建议避免使用strtok(),但这与您的问题无关。
  • 重要提示:requestString 将被 strtok 破坏,因为 strtok 将在找到它们的任何地方将 delim 字符替换为空值。

标签: c++ string parsing arduino


【解决方案1】:

来自cppreference

delim - 指向以 null 结尾的字节字符串标识分隔符的指针

您的方法不适合的要求是null 终止。您获取单个char 的地址,但显然您无法访问超过这个符号的任何内容。但是,strtok 会搜索终止字符串的 \0 字符。因此,您正在进入未定义的行为领域。

改为使用

const char* delimiter = "|";

【讨论】:

  • 感谢您的回答,在我的案例 23 中解析数字(整数)时遇到问题,当我尝试解析下一个令牌时,令牌为空(null)。也许你知道什么会导致这样的问题
  • @fwouxicd 提出另一个问题的绝佳机会。这个问题简短而中肯。只有用螺栓固定更多的东西才会损坏它。
【解决方案2】:

改变这个:

  const char delimeter = '|';

到这里:

  const char * delimeter = "|";  // note the double quotes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    相关资源
    最近更新 更多