实现1 sscanf
#include <stdio.h>
int main() {
char data[] = "$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D";
char type[6];
char latitude[11];
char latitude_dir;
char longitude[12];
char longitude_dir;
char utc_time[11];
char status;
char checksum[4];
int parsed = sscanf(data, "$%5[^,],%10[^,],%c,%11[^,],%c,%10[^,],%c*%3s",
type, latitude, &latitude_dir, longitude, &longitude_dir,
utc_time, &status, checksum);
if (parsed == 8) {
printf("类型: %s\n", type);
printf("纬度: %s %c\n", latitude, latitude_dir);
printf("经度: %s %c\n", longitude, longitude_dir);
printf("UTC时间: %s\n", utc_time);
printf("状态: %c\n", status);
printf("校验和: %s\n", checksum);
} else {
printf("解析失败\n");
}
return 0;
}
实现2 strtok
#include <stdio.h>
#include <string.h>
int main() {
char data[] = "$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D";
const char *delim = ",*";
char *token = strtok(data, delim);
if (strcmp(token, "$GPGLL") != 0) {
printf("不是 GPGLL 语句\n");
return 1;
}
char *latitude = strtok(NULL, delim);
char *latitude_dir = strtok(NULL, delim);
char *longitude = strtok(NULL, delim);
char *longitude_dir = strtok(NULL, delim);
char *utc_time = strtok(NULL, delim);
char *status = strtok(NULL, delim);
char *checksum = strtok(NULL, delim);
printf("纬度: %s %s\n", latitude, latitude_dir);
printf("经度: %s %s\n", longitude, longitude_dir);
printf("UTC时间: %s\n", utc_time);
printf("状态: %s\n", status);
printf("校验和: %s\n", checksum);
return 0;
}
实现方法1:strtok()
#include <stdio.h>
#include <string.h>
int main() {
char *str = "$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D";
char *token;
const char *delim = ",*";
char *strCopy = strdup(str);
token = strtok(strCopy, delim);
while (token != NULL) {
printf("Token: %s\n", token);
token = strtok(NULL, delim);
}
free(strCopy);
return 0;
}
实现方法2:strtok_r()
#include <stdio.h>
#include <string.h>
void parseGPGLL(const char *sentence);
int main() {
const char *gpsData = "$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D";
parseGPGLL(gpsData);
return 0;
}
void parseGPGLL(const char *sentence) {
char *token;
char *str = strdup(sentence);
char *saveptr;
char utcTime[15];
token = strtok_r(str, ",", &saveptr);
printf("Sentence Type: %s\n", token);
token = strtok_r(NULL, ",", &saveptr);
double latitude = atof(token);
token = strtok_r(NULL, ",", &saveptr);
char latitudeHemisphere = token[0];
token = strtok_r(NULL, ",", &saveptr);
double longitude = atof(token);
token = strtok_r(NULL, ",", &saveptr);
char longitudeHemisphere = token[0];
token = strtok_r(NULL, ",", &saveptr);
strncpy(utcTime, token, sizeof(utcTime) - 1);
utcTime[sizeof(utcTime) - 1] = '\0';
token = strtok_r(NULL, "*", &saveptr);
char status = token[0];
token = strtok_r(NULL, "*", &saveptr);
printf("Latitude: %f°%c\n", latitude, latitudeHemisphere);
printf("Longitude: %f°%c\n", longitude, longitudeHemisphere);
printf("UTC Time: %s\n", utcTime);
printf("Status: %c\n", status);
printf("Checksum: %s\n", token);
free(str);
}