尝试使用 String 正确子串
Trying to properly substring with String
给定以下函数:
如果我执行setColor("R:0,G:0,B:255,");
我希望 red
、grn
、blu
值为:
0 0 255
除了我得到 0 0 0
虽然 R:255,G:0,B:0,
或 R:0,G:255,B:0,
工作正常。
int setColor(String command) {
//Parse the incoming command string
//Example command R:123,G:100,B:50,
//RGB values should be between 0 to 255
int red = getColorValue(command, "R:", "G");
int grn = getColorValue(command, "G:", "B");
int blu = getColorValue(command, "B:", ",");
// Set the color of the entire Neopixel ring.
uint16_t i;
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(red, grn, blu));
}
strip.show();
return 1;
}
int getColorValue(String command, String first, String second) {
int rgbValue;
String val = command.substring(command.indexOf(first)+2, command.indexOf(second));
val.trim();
rgbValue = val.toInt();
return rgbValue;
}
在不知道您的 String
实现的情况下,我只能做出有根据的猜测。
发生的事情是 indexOf(second)
没有给你你的想法。
"R:0,G:0,B:255,"
^ ^- indexOf("B:")
|- indexOf(",")
它适用于您的其他情况,因为 none 他们寻找的东西在字符串中出现不止一次。
查看 SparkCore Docs 我们找到了 indexOf
和 substring
的文档。
indexOf()
在另一个字符串中定位一个字符或字符串。默认情况下,从字符串的开头搜索,但也可以从给定的索引开始,允许查找字符或字符串的所有实例。
string.indexOf(val)
string.indexOf(val, from)
子字符串()
string.substring(from)
string.substring(from, to)
现在要解决您的问题,您可以使用 indexOf
的第二个变体,并将您从第一次搜索中找到的索引传递给它。
int getColorValue(String command, String first, String second) {
int rgbValue;
int beg = command.indexOf(first)+2;
int end = command.indexOf(second, beg);
String val = command.substring(beg, end);
val.trim();
rgbValue = val.toInt();
return rgbValue;
}
我可以假设 command.indexOf(second)
总是会找到 第一个 逗号,因此对于 B
来说 val
变成空字符串。
假设 indexOf
类似于 .Net's,也许可以尝试
int start = command.indexOf(first)+2;
int end = command.indexOf(second, start)
String val = command.substring(start+2, end);
注意第二次调用 indexOf
的第二个参数,我认为这将使 indexOf
在 start
之后寻找匹配项.我还认为您最好将 ","
作为 second
传递给所有调用,并将 +1 或 -1 添加到 end
以补偿此传递 ","
而不是"G"
和 "B"
.
或者只对 B
部分使用另一个限制器,例如 R:0,G:0,B:0.
(点而不是逗号)。
我最后只是修改了我的代码:
int setColor(String command) {
int commaIndex = command.indexOf(',');
int secondCommaIndex = command.indexOf(',', commaIndex+1);
int lastCommaIndex = command.lastIndexOf(',');
String red = command.substring(0, commaIndex);
String grn = command.substring(commaIndex+1, secondCommaIndex);
String blu = command.substring(lastCommaIndex+1);
// Set the color of the entire Neopixel ring.
uint16_t i;
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(red.toInt(), grn.toInt(), blu.toInt()));
}
strip.show();
return 1;
}
我只是做了:255,0,0
,效果很好。
在这种情况下,我会使用逗号作为分隔符拆分字符串,然后将每个子字符串解析为一个键值对。如果你总是有序列 "R,G,B",你可以为第二部分使用价值向量,在这种情况下,为什么要有 "R:"、"G:" 或 "B:"?
给定以下函数:
如果我执行setColor("R:0,G:0,B:255,");
我希望 red
、grn
、blu
值为:
0 0 255
除了我得到 0 0 0
虽然 R:255,G:0,B:0,
或 R:0,G:255,B:0,
工作正常。
int setColor(String command) {
//Parse the incoming command string
//Example command R:123,G:100,B:50,
//RGB values should be between 0 to 255
int red = getColorValue(command, "R:", "G");
int grn = getColorValue(command, "G:", "B");
int blu = getColorValue(command, "B:", ",");
// Set the color of the entire Neopixel ring.
uint16_t i;
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(red, grn, blu));
}
strip.show();
return 1;
}
int getColorValue(String command, String first, String second) {
int rgbValue;
String val = command.substring(command.indexOf(first)+2, command.indexOf(second));
val.trim();
rgbValue = val.toInt();
return rgbValue;
}
在不知道您的 String
实现的情况下,我只能做出有根据的猜测。
发生的事情是 indexOf(second)
没有给你你的想法。
"R:0,G:0,B:255,"
^ ^- indexOf("B:")
|- indexOf(",")
它适用于您的其他情况,因为 none 他们寻找的东西在字符串中出现不止一次。
查看 SparkCore Docs 我们找到了 indexOf
和 substring
的文档。
indexOf() 在另一个字符串中定位一个字符或字符串。默认情况下,从字符串的开头搜索,但也可以从给定的索引开始,允许查找字符或字符串的所有实例。
string.indexOf(val)
string.indexOf(val, from)
子字符串()
string.substring(from)
string.substring(from, to)
现在要解决您的问题,您可以使用 indexOf
的第二个变体,并将您从第一次搜索中找到的索引传递给它。
int getColorValue(String command, String first, String second) {
int rgbValue;
int beg = command.indexOf(first)+2;
int end = command.indexOf(second, beg);
String val = command.substring(beg, end);
val.trim();
rgbValue = val.toInt();
return rgbValue;
}
我可以假设 command.indexOf(second)
总是会找到 第一个 逗号,因此对于 B
来说 val
变成空字符串。
假设 indexOf
类似于 .Net's,也许可以尝试
int start = command.indexOf(first)+2;
int end = command.indexOf(second, start)
String val = command.substring(start+2, end);
注意第二次调用 indexOf
的第二个参数,我认为这将使 indexOf
在 start
之后寻找匹配项.我还认为您最好将 ","
作为 second
传递给所有调用,并将 +1 或 -1 添加到 end
以补偿此传递 ","
而不是"G"
和 "B"
.
或者只对 B
部分使用另一个限制器,例如 R:0,G:0,B:0.
(点而不是逗号)。
我最后只是修改了我的代码:
int setColor(String command) {
int commaIndex = command.indexOf(',');
int secondCommaIndex = command.indexOf(',', commaIndex+1);
int lastCommaIndex = command.lastIndexOf(',');
String red = command.substring(0, commaIndex);
String grn = command.substring(commaIndex+1, secondCommaIndex);
String blu = command.substring(lastCommaIndex+1);
// Set the color of the entire Neopixel ring.
uint16_t i;
for (i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, strip.Color(red.toInt(), grn.toInt(), blu.toInt()));
}
strip.show();
return 1;
}
我只是做了:255,0,0
,效果很好。
在这种情况下,我会使用逗号作为分隔符拆分字符串,然后将每个子字符串解析为一个键值对。如果你总是有序列 "R,G,B",你可以为第二部分使用价值向量,在这种情况下,为什么要有 "R:"、"G:" 或 "B:"?