Parse GPS String for Time and Coordinates

Code

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

void parse_gprmc(char *nmea) {
    char time[20] = {0};
    char lat[20] = {0};
    char ns[2] = {0};
    char lon[20] = {0};
    char ew[2] = {0};
    
    int i = 0, j = 0;
    int field = 0;

    while (nmea[i] != ',' && nmea[i] != '\0') i++;
    if (nmea[i] == ',') i++;

    while (nmea[i] != '\0' && field < 6) {
        if (nmea[i] == ',') {
            if (field == 0) time[j] = '\0';  
            else if (field == 2) lat[j] = '\0';  
            else if (field == 3) ns[j] = '\0';  
            else if (field == 4) lon[j] = '\0';  
            else if (field == 5) ew[j] = '\0';  
            
            field++;
            j = 0;
            i++;
            continue;
        }
        
        if (field == 0) {
            if (j == 2 || j == 5) {
                time[j] = ':';
                j++;
            }
            time[j] = nmea[i];
            j++;
        }
        else if (field == 2 && j < 19) {  
            lat[j++] = nmea[i];
        }
        else if (field == 3 && j < 1) {  
            ns[j++] = nmea[i];
        }
        else if (field == 4 && j < 19) {  
            lon[j++] = nmea[i];
        }
        else if (field == 5 && j < 1) {  
            ew[j++] = nmea[i];
        }
        
        i++;
    }
    
    if (field == 0) time[j] = '\0';
    else if (field == 2) lat[j] = '\0';
    else if (field == 3) ns[j] = '\0';
    else if (field == 4) lon[j] = '\0';
    else if (field == 5) ew[j] = '\0';
    
    printf("Time: %s\n", time);
    printf("Latitude: %s %s\n", lat, ns);
    printf("Longitude: %s %s\n", lon, ew);
}

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