2015-06-09 2 views
1

У меня есть строка для разбора. Эта строка имеет почти определенный формат с координатами GPS. Я хочу получить координаты.Как анализировать почти определенную строку в C?

Иногда у меня есть это:

09:24:29 N 012:34:35 W, 09:22:18 N 012:33:55 W 

Но иногда у меня есть лишние пробельные:

09:24:29 N 012:34:35 W , 09:22:18 N 012:33:55 W 

Но иногда меня нет пробельные:

09:24:29 N 012:34:35 W,09:22:18 N 012:33:55 W 

Но иногда у меня есть десятичное:

09:24:29.3 N 012:34:35.2 W, 09:22:18.1 N 012:33:55.6 W 

Так что мой вопрос: Какой самый надежный и портативный способ прочитать эти координаты GPS в C?

Сначала я начал с sscanf, но у меня много проблем с дополнительными (или нет) пробелами и десятичными знаками.

+0

Совместное использование ваших исследований помогает всем. Расскажите, что вы пробовали и почему это не соответствовало вашим потребностям. Это демонстрирует, что вы потратили время, чтобы попытаться помочь себе, это избавляет нас от повторения очевидных ответов и, прежде всего, помогает вам получить более конкретный и релевантный ответ! Также см. [Как спросить] (http://stackoverflow.com/questions/how-to-ask) – Eregrith

+1

Начните с определения грамматики *. Затем создайте для него синтаксический анализатор. Возможно, вы сможете использовать библиотеку для второй части. (В C++ я, вероятно, был бы пухлым для Boost Spirit). – Bathsheba

+0

обрабатывающие строки всегда беспорядочны в C. Вы могли бы использовать другой язык? Если нет, либо пойдите с парсером, как предлагает @Bathsheba, или если грамматика достаточно проста, вы можете обработать строковый символ символом char и построить свои значения вручную. –

ответ

2

Я предлагаю вам сначала разделить на несколько строк на запятую, а затем использовать sscanf будет проще, поскольку вам просто не нужно заботиться о ведущем или конечном пространстве.

Что касается десятичной точки, если вы читаете как float, он сможет читать как "18", так и "18.1". Однако вам может потребоваться знать некоторые из the problems with floating point data on binary computers.

1

Thanks Joachim, использование плавающей - хорошая идея.

Это должно работать:

sscanf(gps_string, "%d:%d:%f %c %d:%d:%f %c", ...); 

sscanf(strchr(gps_string, ',')+1, "%d:%d:%f %c %d:%d:%f %c", ...); 

Спасибо за вашу помощь и идеи!

+0

Нет необходимости в двух 'sscanf's. Вы можете просто использовать 'sscanf (gps_string,"% d:% d:% f% c% d:% d:% f% c,% d:% d:% f% c% d:% d:% f% c ", ...);' –

Смежные вопросы