#include <stdio.h> #include <string.h> // helper function to convert hhmmss to hh:mm:ss void format_time(const char* raw, char* out, size_t out_size) { // Fallback to zeros for invalid input if(!raw || strlen(raw) < 6 || out_size < 9) { snprintf(out, out_size, "00:00:00"); } snprintf(out, out_size, "%c%c:%c%c:%c%c", raw[0], raw[1], raw[2], raw[3], raw[4], raw[5]); } void parse_gprmc(char *nmea) { // Your logic here // edge case if(!nmea) return; // Copy the data to a buffer char buf[128]; strncpy(buf, nmea, sizeof(buf) - 1); buf[sizeof(buf) - 1] = '\0'; // add delimiter // tokenize the buffer char* fields[7] = {0}; // read and parse only the first 7 int i = 0; char* token = strtok(buf, ","); while(token && i < 7) { fields[i++] = token; token = strtok(NULL, ","); } if(i < 7) return; // Not enough fields // Format time char UTC_Time[9]; format_time(fields[1], UTC_Time, sizeof(UTC_Time)); printf("Time: %s\n", UTC_Time); printf("Latitude: %s %s\n", fields[3], fields[4]); printf("Longitude: %s %s\n", fields[5], fields[6]); } int main() { char nmea[100]; fgets(nmea, sizeof(nmea), stdin); parse_gprmc(nmea); return 0; }
Test Cases
Test Results
Input
$GPRMC,123519,A,4807.038,N,01131.000,E
Expected Output
Time: 12:35:19 Latitude: 4807.038 N Longitude: 01131.000 E