尝试使用String正确子串

时间:2015-04-23 10:43:22

标签: c++ microcontroller sparkcore

给出以下功能:

如果我执行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;
}

4 个答案:

答案 0 :(得分:2)

在不了解您的String实施情况的情况下,我只能做出有根据的猜测。 会发生什么是indexOf(second)没有给你你的想法。

"R:0,G:0,B:255,"
    ^    ^- indexOf("B:")
    |- indexOf(",")

它适用于您的其他情况,因为它们所寻找的任何内容都不会在字符串中出现过多次。

查看SparkCore Docs,我们找到了indexOfsubstring的文档。

<强>的indexOf() 在另一个String中查找字符或字符串。默认情况下,从String的开头搜索,但也可以从给定索引开始,允许定位字符或String的所有实例。

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;
}

答案 1 :(得分:1)

在这个例子中,我将使用逗号分隔字符串作为分隔符,然后将每个子字符串解析为键值对。如果你总是有序列&#34; R,G,B&#34;你可以使用第二部分的值向量。在这种情况下,为什么有&#34; R:&#34;,&#34; G:&#34;或者&#34; B:&#34;一点都没有?

答案 2 :(得分:0)

我可以假设stack nodes//create a new stack add(nodes , startNode)//initialize the stack with the first node while ! isEmpty(nodes)//still nodes available that haven't been processed node p = peek(nodes) if ! nodeInArray(p) OR getColor(p) == 1 //this node has already been visited or is not in the array //continue with the next node in the stack pop(nodes) continue color(p , 1)//mark the node as visited push(nodes , node(x(p) - 1 , y(p))//add node to be processed in the future ...//push all other neighbours to the stack 始终会找到第一个逗号,因此对于command.indexOf(second)B变为空字符串。

假设val.Net's类似,可以尝试

indexOf

请注意第二次调用int start = command.indexOf(first)+2; int end = command.indexOf(second, start) String val = command.substring(start+2, end); 的第二个参数,我认为这会使indexOfindexOf之后查找匹配。我还认为您最好为所有来电传递start ",",并为second添加+1或-1以补偿此次传递end而不是",""G"

或者只使用"B"部分的其他限制器,例如B(点而不是逗号)。

答案 3 :(得分: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并且它可以解决问题。