Parse GPS String for Time and Coordinates

Code

#include <stdbool.h>
#include <stdio.h>
#include <string.h>

void parse_gprmc(char *nmea) {
  // Your logic here
  int i = 0;
  int field = 0;
  int before = 0, after = 0;
  bool isAfter = false;
  int hours = 0, minutes = 0, seconds = 0;

  while (nmea[i] != '\0') {
    if (nmea[i] == ',') {
      field++;
      i++;
      continue;
    }

    if (field == 0) {
    } else if (field == 1) {
      hours = ((nmea[i] - '0') * 10) + (nmea[i + 1] - '0');
      minutes = ((nmea[i + 2] - '0') * 10) + (nmea[i + 3] - '0');
      seconds = ((nmea[i + 4] - '0') * 10) + (nmea[i + 5] - '0');
      printf("Time: %.2d:%.2d:%.2d\n", hours, minutes, seconds);
      i += 5;
    } else if (field == 2) {
    } else if (field == 3) {
      if (nmea[i] == '.') {
        isAfter = true;
        i++;
        continue;
      }
      if (!isAfter) {
        before = before * 10 + (nmea[i] - '0');
      } else {
        after = after * 10 + (nmea[i] - '0');
      }
    } else if (field == 4) {
      printf("Latitude: %.4d.%.3d %c\n", before, after, nmea[i]);
      before = 0;
      after = 0;
      isAfter = false;
    } else if (field == 5) {
      if (nmea[i] == '.') {
        isAfter = true;
        i++;
        continue;
      }
      if (!isAfter) {
        before = before * 10 + (nmea[i] - '0');
      } else {
        after = after * 10 + (nmea[i] - '0');
      }
    } else if (field == 6) {
      printf("Longitude: %.5d.%.3d %c", before, after, nmea[i]);
    }

    i++;
  }
}

int main() {
  char nmea[100];
  fgets(nmea, sizeof(nmea), stdin);
  parse_gprmc(nmea);
  return 0;
}

Solving Approach

 

 

 

Upvote
Downvote
Loading...

Input

$GPRMC,123519,A,4807.038,N,01131.000,E

Expected Output

Time: 12:35:19 Latitude: 4807.038 N Longitude: 01131.000 E