繁体   English   中英

C++如何将char *保存到char *数组中[]

[英]C++ How to save char* into array of char* []

我有一个byte*我正在保存到一个char[]

打印 char[] 我得到

0,1023,1023,1000;0,0,1023,1000;1023,0,0,1000;1023,1023,0,1000;0,1023,0,1000

我将它传递给使用 strtok 拆分“;”的函数,将该值保存到char *colorsAtTick; ,然后我试图将其保存到数组中char *colorsAtTickArray[] = {}; 通过做colorsAtTickArray[patternLength] = colorsAtTick;

但是在循环中尝试访问colorsAtTickArray[i]时出现错误。

代码是:

void callback(char* topic, byte* payload, unsigned int length) 
{
  //save payload bytes into char
  char pattern[length+1];
  for (int i = 0; i < length; i++) 
  {
    pattern[i] = (char)payload[i];
  }
  pattern[length+1] = '\0';
  Serial.print("this is the whole pattern: ");
  Serial.println(pattern);
  splitPatternTicks(pattern);
}

void splitPatternTicks(char *pattern) {
  char *colorsAtTick;
  char *colorsAtTickArray[] = {};
  //split pattern on ";" into chars
  colorsAtTick= strtok (pattern,";");
  while (colorsAtTick != NULL)
  {
    Serial.print("split on ; -->");
    Serial.println(colorsAtTick);
    //save the chars into an array
    colorsAtTickArray[patternLength] = colorsAtTick;

    patternLength ++;
    colorsAtTick = strtok (NULL,";");
  }
  for (int i = 0; i < patternLength; i ++) {
    //loop over the array of char to further split and save values
    //colorsAtTickArray ex. "255,0,0,1000"
    Serial.println("trying to parse values, sending ->");
    Serial.println(colorsAtTickArray[i]);
    //line above prints a blank line, then an error is thrown
    //parseTickValues(colorsAtTickArray[i], patternLength);
    //list[i] -> printObj();
  }
}

终端输出:


这是整个模式:

0,1023,1023,1000;0,0,1023,1000;1023,0,0,1000;1023,1023,0,1000;0,1023,0,1000


split on ; -->0,1023,1023,1000

split on ; -->0,0,1023,1000

split on ; -->1023,0,0,1000

split on ; -->1023,1023,0,1000

split on ; -->0,1023,0,1000

trying to parse values, sending ->


Exception (28):
epc1=0x40208ccc epc2=0x00000000 epc3=0x00000000 excvaddr=0x0000000c depc=0x00000000

stack

ctx: cont
sp: 3ffffcf0 end: 3fffffc0 offset: 01a0
3ffffe90:  40203124 3ffee720 0000000c 402033f8  
3ffffea0:  3ffee608 3ffee720 3ffee720 40203465  
3ffffeb0:  3ffee608 3ffee720 00000000 40201224  
3ffffec0:  0000000c 0000004b 3ffee720 40203448  
3ffffed0:  0000000c 3ffee720 3ffee720 3fffff40  
3ffffee0:  0000000c 3ffee720 3ffffef0 40201290 <
3ffffef0:  30312c30 312c3332 2c333230 30303031  
3fffff00:  302c3000 3230312c 30312c33 31003030  
3fffff10:  2c333230 2c302c30 30303031 32303100  
3fffff20:  30312c33 302c3332 3030312c 2c300030  
3fffff30:  33323031 312c302c 00303030 6bc6a700  
3fffff40:  00000001 00005b68 3ffee60c 4020525c  
3fffff50:  3fffdad0 00005b68 3ffee60c 4020300c  
3fffff60:  007a1201 73c993ca 3ffee700 40202e90  
3fffff70:  00000004 3ffee60f 0000005b 402010b5  
3fffff80:  00000000 00000000 3ffee60c 3ffee798  
3fffff90:  3fffdad0 00000000 3ffee60c 402011a0  
3fffffa0:  3fffdad0 00000000 3ffee758 40203b80  
3fffffb0:  feefeffe feefeffe 3ffe84e8 40100bdd  
<<<stack<<<
⸮n⸮⸮⸮⸮⸮⸮

我正在测试我试图在 repl 中完成什么,但我也有问题(在这个例子中,只有 3 个打印了 2 个) https://repl.it/@jordanklaers/arrayOfChars

off by 1 error

pattern[length+1] = '\0';

这将覆盖数组末尾并替换导致错误的堆栈上的信息
pattern数组中的最后一个元素将是pattern[length]
您还在 for 循环中包含了一个常见错误。 请看这篇文章的解释

感谢 Sam Varshavchik 和其他提到这个问题的人,我通过使用

char *colorsAtTickArray[ticks];

其中 ticks 是一个变量,表示值的数量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM