Arduino 拆分字符 * 基于分隔符到值

Posted

技术标签:

【中文标题】Arduino 拆分字符 * 基于分隔符到值【英文标题】:Arduino split char* based on delimiter to value 【发布时间】:2020-03-22 17:59:40 【问题描述】:

感谢您的时间,所以我有一个来自 mqtt 的 Char*

我想将其分解为 3 个单独的值

Char* mqttvalue
//Input Would be like the below for example. 
mqttvalue = (255,200,230);

// I would like to split the values into the below.
int 1 = 255
int 2 = 200
int 3 = 230

我试过 strtok 没有运气。可能真的很愚蠢,但一些指导会有所帮助。

谢谢

编辑,我试过了。

//Dummy Value for testing 
Split("255,240,230");

//Split Value
void Split(char*  e) 
  String v[3];
  char *p;
  int i = 0;
  p = strtok(e, ",");
  while(p && i < 3)
  
    v[i] = p;
     p = strtok(NULL, ",");
     Serial.println(p);
     ++i;
  ;
  Serial.println(v[0]);
  Serial.println(v[1]);
  Serial.println(v[2]);

【问题讨论】:

然后选择 C ​​或 C++。每种语言使用不同的函数。 查看strtok 文档后,您的方法似乎很好。你有什么问题?你得到什么输出? “没有运气”不是很具有描述性 你调用split 并带有一个字符串。这不是 strtok 的有效参数,因为它修改了提供的字符串。 你上面的伪代码没有任何意义。您谈论拆分字符串,但使用整数来存储结果。此外,括号中的某些整数与输入字符串不同。在准备问题时,您应该更加精确。 我认为关键可能在于@Gerhardh 所说的。像char test[] = "255,240,230"; 一样创建一个测试char* 并将that 传递给Split 【参考方案1】:

将下面的代码从字符串更新为 char* 现在一切正常。

 //Split Value
 void Split(char*  e) 
  char* v[3];
  char *p;
  int i = 0;
  p = strtok(rgb, ",");
  while(p && i < 3)
   
    v[i] = p;
    p = strtok(NULL, ",");
    i++;
  ;
  Serial.println(v[0]);
  Serial.println(v[1]);
  Serial.println(v[2]);
 ;

【讨论】:

【参考方案2】:

因为这是一个经常被问到的问题,我建议更像是在 C 字符串上使用继承 Stream interface 的包装类(它也可以从 Arduino String 对象初始化)。

然而,使用 Arduino String 类很棘手,因为在使用 StringStream 期间不应更改原始字符串,但可以再次重新初始化它。通过使用非 const 引用作为setData 方法和构造函数的参数,禁止使用右值(String 字面量,传递给类)。

但是它没有经过太多测试,所以可能会有一些错误。复制/移动构造函数和分配被省略(它不应该是:D),也使用operator=(String&amp;)operator=(const char*) 将是更直观的界面。

class StringStream : public Stream

  public:
    StringStream()
    
      setTimeout(1);
    

    StringStream(const char * str)
    
      setData(str);
    

    StringStream(const char * begin, const char * end)
    
      setData(begin, end);
    

    explicit StringStream(String & view) // cannot be String literal (rvalue) and it gets invalidated if you change original String
    
      setData(view);
    

    ////////////////////////////////////
    inline void setData(const char * begin, const char * end)
    
      m_start = begin;
      m_end = end;
      setTimeout(1);
    

    inline void setData(const char * begin)
    
      setData(begin, begin + strlen(begin));
    

    inline void setData(String & view)
    
      setData(view.c_str(), m_start + view.length());
    

    //////////////////////////////////
    // Stream Interface:
    virtual int available() override
    
      return m_end - m_start;
    

    virtual int read() override
    
      if (m_start < m_end)
      
        return *(m_start++);
      
      return -1;
    

    virtual int peek() override
    
      if (m_start < m_end)
      
        return *m_start;
      
      return -1;
    

    virtual size_t write(uint8_t) override 
      return 0;
    

  protected:
    const char * m_start0;
    const char * m_end0;
;

测试程序是这样的:

void setup() 
  Serial.begin(115200);


void loop() 
  Serial.println("Output:");

  StringStream test" 144, 7899, -5478";
  Serial.println(test.parseInt());
  Serial.println(test.parseInt());
  Serial.println(test.parseInt());

  test.setData("1 2");
  Serial.println(test.parseInt());
  Serial.println(test.parseInt());

  delay(2000);

【讨论】:

以上是关于Arduino 拆分字符 * 基于分隔符到值的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL基于分隔符拆分列并将拆分后的字符串数组输入到多个表列中

如何基于多个空格字符将文本文件拆分为 2 列作为 scala spark 的分隔符

根据多个分隔符拆分字符串

基于SQL Server中的分隔符将文本拆分为多列

Pandas使用str属性获取数据列的字符串方法类split函数基于指定分隔符拆分数据列的内容为列表设置参数n控制拆分的次数设置expand参数将拆分结果列表内容转化为多列dataframe

Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列数据并添加到原数据中replace函数基于正则表达式替换字符串数据列中的匹配内容