Попытка правильно подстроки с помощью 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;
}

1

Решение

Я могу предположить, что command.indexOf(second) всегда найдет тебя первый запятая, поэтому для B val становится пустой строкой.

При условии, что indexOf что-то похожее на .Net-х, может быть попробовать

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. (точка вместо запятой).

0

Другие решения

Не зная вашего String Реализация, я могу только сделать обоснованное предположение.
Что происходит то indexOf(second) не дает вам то, что вы думаете.

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

Это работает для других ваших случаев, поскольку ни одна из вещей, которые они ищут, не встречается в строке более одного раза.

Глядя на SparkCore Документы мы находим документацию для обоих indexOf а также substring,

индекс()
Находит символ или строку в другой строке. По умолчанию поиск выполняется с начала строки, но также может начинаться с заданного индекса, что позволяет найти все экземпляры символа или строки.

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

В этом случае я бы разделил строку, используя запятую в качестве разделителя, а затем проанализировал каждую подстроку в пару ключ-значение. Вы можете использовать вектор значения для второй части, если у вас всегда есть последовательность «R, G, B», и в этом случае зачем вообще есть «R:», «G:» или «B:»?

1

В итоге я просто изменил свой код:

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 и это работает удовольствие.

0
По вопросам рекламы [email protected]