提取GPGGA语句中N、E前GPS坐标值的C++程序问题
解决GPGGA语句坐标提取问题
问题原因
你用cin>>a>>b>>c>>d>>e>>f>>g>>h>>l;读取输入的方式失效,核心原因是**cin默认以空白字符(空格、换行、制表符)作为字段分隔符**,但GPGGA语句的各个字段是用逗号,分隔的。这会导致整个GPGGA字符串被一次性读入第一个变量,后续变量都是未初始化的垃圾值,自然输出结果异常。
解决方案
针对逗号分隔的NMEA语句,推荐两种简单可靠的解析方式:
方法1:替换逗号为空白字符后解析
先读取完整的GPGGA语句,将所有逗号替换为空格,再用字符串流(stringstream)按空白分隔提取字段:
#include <iostream> #include <string> #include <sstream> using namespace std; int main() { string ggaStr; // 读取完整的GPGGA语句 getline(cin, ggaStr); // 将所有逗号替换为空格 for (char& c : ggaStr) { if (c == ',') c = ' '; } string field1, field2, lat, ns, lon, ew; stringstream ss(ggaStr); // 提取需要的前6个字段,后续字段直接忽略 ss >> field1 >> field2 >> lat >> ns >> lon >> ew; // 输出目标坐标 cout << "纬度值:" << lat << endl; cout << "经度值:" << lon << endl; return 0; }
方法2:按逗号直接分割字段
利用getline指定分隔符为逗号,逐个读取每个字段,精准提取需要的纬度和经度:
#include <iostream> #include <string> #include <sstream> using namespace std; int main() { string ggaStr; getline(cin, ggaStr); stringstream ss(ggaStr); string field; int fieldIndex = 0; string lat, lon; while (getline(ss, field, ',')) { switch(fieldIndex) { case 2: // 第3个字段(索引从0开始)是纬度值 lat = field; break; case 4: // 第5个字段是经度值 lon = field; break; default: break; } fieldIndex++; // 拿到目标字段后提前退出循环,提升效率 if (fieldIndex > 4) break; } cout << "纬度值:" << lat << endl; cout << "经度值:" << lon << endl; return 0; }
注意事项
- 如果输入前存在换行符残留,建议先调用
cin.ignore()清除输入缓冲区,避免getline读取空字符串。 - 实际场景中可增加合法性校验(比如确认第一个字段为
$GPGGA),避免非法输入引发错误。
内容的提问来源于stack exchange,提问作者Elbowgrease
相关产品推荐
相关产品推荐

