Parse GPS String for Time and Coordinates

Code

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

void parse_gprmc(const char *nmea) {
    int field = 0;
    int start = 0;
    int len = strlen(nmea);

    for (int i = 0; i <= len; i++) {
        if (nmea[i] == ',' || nmea[i] == '\0') {
            int end = i;
            int flen = end - start;
            if (flen > 0) {
                char buf[32];
                if (flen >= sizeof(buf)) flen = sizeof(buf) - 1;
                strncpy(buf, nmea + start, flen);
                buf[flen] = '\0';

                switch (field) {
                    case 1: // UTC time
                        if (strlen(buf) >= 6) {
                            printf("Time: %c%c:%c%c:%c%c\n",
                                   buf[0], buf[1],
                                   buf[2], buf[3],
                                   buf[4], buf[5]);
                        }
                        break;
                    case 3: // Latitude
                        printf("Latitude: %s", buf);
                        break;
                    case 4: // N/S
                        printf(" %s\n", buf);
                        break;
                    case 5: // Longitude
                        printf("Longitude: %s", buf);
                        break;
                    case 6: // E/W
                        printf(" %s\n", buf);
                        break;
                }
            }
            start = i + 1;
            field++;
        }
    }
}




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