【问题标题】:Extracting a sequence of a whole string (Arduino, C++, indexOf, substring)提取整个字符串的序列(Arduino、C++、indexOf、子字符串)
【发布时间】:2020-07-06 14:27:50
【问题描述】:

我想提取整个字符串的任意部分并通过Serial.println()发布。

我遇到的来源问题是字符串值(A,B,C)是变量,因此是“未知的”。它与定义的终止符“-”和“END $”混淆。我找不到合适的锚点来获取我想要的字符串的确切部分。如果这些字符串值不存在,我可以:“curD = 'Data: String1 A'”与“curD = 'String1'”。我只想要“String1 A”、“String2 B”或“String3 C”。

示例 A、B、C 是 int、float 或可变/随机长度的字符串。

这是我目前所拥有的:

  char headComputerData[] = "String1 - "; // test; can be String1 -, String2 - etc, to get the next adjacent string sequence till " -"
  //char headComputerData[] = "Computer Data: "; // the prefix of the data value
  char dashTerminator[] = " -";     // one possible suffix of a value
  char dollarTerminator[] = " END $ ";   // the other possible suffix of a value
  int firstIndexComputerData;     // index into inputStringPC of the first char of the value

  String inputStringPC = "Computer Data: String1 A - String2 B - String3 C END $ ";


      firstIndexComputerData = inputStringPC.indexOf(headComputerData);
      firstIndexComputerData += strlen(headComputerData); // firstIndex is now the index of the char just past the head.
      String compData = inputStringPC.substring// string everything between 
      (
      firstIndexComputerData, //first index
      inputStringPC.indexOf(dashTerminator, firstIndexComputerData) //last index (relative)
      );

      Serial.println(compData);

谢谢:)

无限制

【问题讨论】:

  • "我找不到合适的锚点来获取我想要的字符串的确切部分。" - 这是问题的核心吗?如果是这样,您不能删除与问题无关的所有内容,并在程序中只留下一个简短的示例吗?我很肯定在这种情况下它会很快得到解决。
  • 谢谢,我已经删除了不必要的代码行。
  • 好!尝试提出问题的minimal reproducible example。举一个您无法解决的简单案例并将其硬编码为示例。在这样的示例中,Serial.println() 没有位置。只需处理手头的问题。

标签: c++ string arduino substring indexof


【解决方案1】:

输入:

"Computer Data: String1 A - String2 B - String3 C END $ "<br>
         0     1       2 3 4       5 6 7       8 9   10

输出应该是

 String1 A
 String2 B
 String3 C

如果那是正确的,为什么不使用空格分隔符 - 前提是输入始终是相同的格式(见上文),因此您可以按如下方式过滤:

uint8_t spaceIndex [11] = {};   // we store 10 values + 0 terminator
String inputStringPC = "Computer Data: String1 A - String2 B - String3 C END $ ";
for (uint8_t i = 0; i<10; i++){  // we read 10 space delimiter indices into an array
       if (i != 0) spaceIndex[i] = inputStringPC.indexOf(' ', spaceIndex[i-1] );
        else spaceIndex[i] = inputStringPC.indexOf(' ');
  }
  // Extract the relevant data as strings (indexStart + 1 / indexEnd - 1)
  String Astring = inputStringPC.substring (spaceIndex[1] + 1, spaceIndex[3] -1);
  String Bstring = inputStringPC.substring (spaceIndex[4] + 1, spaceIndex[6] -1);
  String Cstring = inputStringPC.substring (spaceIndex[7] + 1, spaceIndex[9] -1);

如果我正确解释了您的问题,这应该会提供结果。
提示:摆脱 Arsuino 中的字符串类并使用 char 数组。原理不变。

【讨论】:

  • 如果它有助于标记为已解决,如果不提供反馈,那么缺少什么
猜你喜欢
  • 2016-06-09
  • 2016-06-17
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2018-09-29
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多