У меня есть строка ASCII, исходящая от UART, которая выглядит примерно как «43.533a, 5532», и я хотел бы извлечь два числа. Моя идея заключалась в том, чтобы разделить их с помощью strtok с запятой в качестве разделителя, а затем удалить последний символ из первой строки и затем преобразовать числа с помощью atoi () или есть более простой способ с sscanf ()? Я не часто использую манипуляции со строками. Другая проблема заключается в том, что если String выглядит иначе, как я могу это заметить заранее?
Всегда ли a,
разделяет два числа? Или это может быть другая буква? Может быть несколько букв?
@ user3386109, если не будет, то вот что он спрашивает
idk, но лучше всего использовать индексирование цикла от 0 до len (строка) и использовать оператор if для поиска, если это ascii (48-57), и сохранить результат в массиве
это «всегда» 'a', которое разделяет два числа ... но строка также может выглядеть совершенно по-другому, тогда мне просто нужно ее распознать.
Да, с sscanf()
это легко сделать.
Ниже приводится пример. Смотрите это здесь работают:
#include <stdio.h>
int main(void) {
float a;
int b;
char *sNum = "43.533a,5532";
sscanf(sNum, "%fa,%d", &a, &b);
printf("a= %f || b= %d", a,b);
return 0;
}
Выход:
a= 43.533001 || b= 5532
Примечание: Так как float по умолчанию имеет точность до десятичного разряда 6
, вам, возможно, придется это учитывать и при необходимости исправлять.
Почему я не увидел этого ... позор мне! Все думал о регулярном выражении
Извините за один вопрос, ... что бы произошло в этом случае, если бы входная строка была "ewwf22"? Должен ли я уловить это до sscan ()?
@Humpawumpa Да, потому что в приведенном выше примере строка форматирования статичен. Таким образом, он не может получить числовую часть из входного ewwf22
. Будет проблематично. Для этого нужно использовать другой sscanf()
.
@Humpawumpa sscanf("%*[^0123456789]%d", &b)
может хватить.
Вы хотите извлечь два числа через запятую?