尝试使用 String 正确子串

Trying to properly substring with String

给定以下函数:

如果我执行setColor("R:0,G:0,B:255,");

我希望 redgrnblu 值为:

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 我们找到了 indexOfsubstring 的文档。

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:"?