Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++如何将char *保存到char数组中*[]_C++_Arrays - Fatal编程技术网

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

C++如何将char *保存到char数组中*[],c++,arrays,C++,Arrays,我有一个字节*我正在保存到一个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[]={};通过执行colorsAtTick数组[patternLength]=colorsAtTick 但我在尝试

我有一个字节*我正在保存到一个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[]={};通过执行colorsAtTick数组[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个被打印出来

您有一个off by 1错误

这将覆盖超过数组末尾的内容,并替换导致错误的堆栈上的信息 阵列中的最后一个元素是pattern[length]
在for循环中还包含了一个常见错误

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

char *colorsAtTickArray[ticks];

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

标题是char*[],但您的第一段是char[]。它是哪个?char*colorsAtTickArray[]={};不会做你认为它会做的事。它不会,我重复一遍,不会创建一个无限大的数组,你可以在for循环的主体中,无限制地填充它。这不是数组如何工作在C++中。这将创建一个完全空的数组,当for循环继续在其上涂鸦时,这将导致未定义的行为,并最终保证崩溃。您有一个。另外,请参见。@SamVarshavchik实际上格式不正确。我不相信这是正确的。我用pattern[length+1]创建pattern,循环变为length,因此我节省了额外的空间来添加“\0”,假设length为1,则pattern[length+1]将创建一个包含2个元素的数组。模式[0]和模式[1]。现在,如果你访问长度为1,即2,你基本上是写模式[2 ],它将是2元素数组中的第三元素。希望这个帮助在这个答案中=模式长度,你正在创建一个VLA,它不是标准C++的一部分,但在一些编译器中是可用的。如果您想创建可移植代码,最好使用std::vector来处理类似的内容。
char *colorsAtTickArray[ticks];