C++如何将char *保存到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 但我在尝试
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];