Чтение строки, разделенной запятыми
У меня есть строка, которая выглядит следующим образом "10.00, 20.00, -50.00", в которой это значения угла, они имеют 2 десятичных знака и могут быть отрицательными. Я хочу разделить их на 3 отдельных float. Вот мой текущий код, в котором я использую sscanf. Все, что я получаю, - это 0,00, и я понятия не имею, почему. Любая помощь действительно ценится.
String recvString = "10.00,20.00,-50.00,";
float r,p,y;
void setup() {
Serial.begin(9600);
Serial.println(r);
int result = sscanf(recvString.c_str(), "%f,%f,%f,", &r, &p ,&y);
Serial.println(r);
}
void loop() {}
2 ответа
Лучший ответ:
Используйте функцию indexOf, чтобы найти индекс, затем используйте подстроку, чтобы получить следующие значения:
String recvString = "10.00,20.00,50.00";
float r, p, y;
void setup() {
Serial.begin(9600);
//Serial.println(r);
//recvString.toCharArray(s, recvString.length() + 1);
//int result = sscanf(recvString.c_str(), "%f,%f,%f,", &r, &p ,&y);
int i1 = recvString.indexOf(',');
int i2 = recvString.indexOf(',', i1+1);
Serial.println(i1);
Serial.println(i2);
String firstValue = recvString.substring(0, i1);
String secondValue = recvString.substring(i1 + 1, i2);
String thirdValue = recvString.substring(i2 + 1);
Serial.println(firstValue);
Serial.println(secondValue);
Serial.println(thirdValue);
}
void loop() {
// put your main code here, to run repeatedly:
}
определенно не таким образом, @Juraj
Но это работает, так почему бы и нет?, @DragonflyRobotics
смотрите другой ответ, @Juraj
Реализация AVR sscanf()
не поддерживает синтаксический анализ чисел с плавающей запятой, поэтому вы получаете из нее только нули. Вы не можете использовать с ним спецификатор %f. Вам нужно самостоятельно преобразовать эти числа с помощью таких функций, как
atof()
или аналогичных.
Разделение строки на части может быть выполнено многими способами. Вы могли бы использовать sscanf()
для разделения строковых частей, а затем использовать что-то вроде atof()
для фактического преобразования в float . Или вы используете strtok()
для разделения (см. Мой ответ на этот вопрос). Или вы используете один из многих других вариантов, которые вы получаете, когда ищете в Google что-то вроде "Arduino split string" или "Arduino split c string".
Примечание: Использование класса String в Arduino легко для начинающих, но не является хорошей практикой (динамическое распределение, фрагментация кучи). Посмотрите блог Majenkos для получения дополнительной информации об этом. Поскольку вы уже использовали функцию для C-строк, я бы предложил полностью перейти на C-строки (которые в основном представляют собой только массив
символов
).
- Еще один простой и глупый вопрос о строках C++
- Использование StringStream в скетче Arduino
- Как на самом деле объединить две строки?
- String() против char для простого управления потоком
- Использование строк внутри кода расширений mBlock
- Как улучшить этот Код? (или как передать строку Char в функцию, чтобы она вела себя как переменная)
- Новичок, изучающий Serial.readString()
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
Это не полный дубликат, но он поможет вам лучше понять проблему и причины: https://stackoverflow.com/questions/27651012/arduino-sprintf-float-not-formatting . Вы можете использовать функцию http://www.cplusplus.com/reference/cstdlib/strtod /`, @Michel Keijzers
запятая - это не пробел ...https://stackoverflow.com/questions/15091284/read-comma-separated-input-with-scanf#15091406, @jsotola