C++用SSCANF函数提取出现的问题

我用C++写了一个函数,目的是提取GPS的数据,把需要的数据存入结构体变量,GPS数据格式如下:
$GPGGA,102639.00,3906.89667,N,11720.83367,E,1,4,4.14,505.0,M,-2.3,M,,*7C
我的函数文件如下:
头文件(定义了我的函数结构体):
typedef struct
{
char time[20];
double Latitude_value;
char LatiNS[3];
double Longitude_value;
char LongiEW[3];
char GPSQuality[2];
int NumOfSat;
double AntennaHight;
double HorizontalDOP;
}GPS_INFO;
函数文件:
#include <iostream>
#include <string>
#include <stdio.h>

#include "testfile.h"

using namespace std;

int main()
{
GPS_INFO GPS;

char str[200]= "$GPGGA,102639.00,3906.89667,N,11720.83367,E,1,4,4.14,505.0,M,-2.3,M,,*7C";

sscanf(str,"$GPGGA, %[^,], %lf, %c, %lf,%c", GPS.time, &(GPS.Latitude_value), GPS.LatiNS,&(GPS.Longitude_value), GPS.LongiEW);

cout << GPS.time <<" "<< GPS.Latitude_value <<" "<< GPS.LatiNS << " " << GPS.Longitude_value << " "<< GPS.LongiEW << " "<< endl;

return 0;
}
结果显示如图:

我想问以下几个问题:
1. 为什么我在结构体里定义了坐标经度和纬度为Double类,但用SSCANF函数后,它的取值才到小数点后一位,正确应该是提取到小数点后五位才对?
2.应为无法用CHAR来提取方向,比如LatiNS,我不得不用字符串才能提取,这里面有什么问题?
3.为什么我的输出结果出现了一大串乱码?这是什么原因?如果用修改的源码附上,就很好了。
希望能和大家讨论以下!!谢谢

第1个回答  2011-01-14
给你简化一下问题,专注如何读:
char str[200]= "$GPGGA,102639.00,3906.89667,N,11720.83367,E,1,4,4.14,505.0,M,-2.3,M,,*7C";
double x,y,x2,y2;
char s1[10],s2[10], s3[10];
以逗号为分格符,要读一个字符串用:
sscanf(str,"%[^','],%lf, %lf,%[^','],%lf,%[^','],%lf",s1,&x,&y,s2,&x2,s3,&y2);
以逗号为分格符,跳过一个字符串用:
sscanf(str,"%*[^','],%lf, %lf,%*[^','],%lf,%*[^','],%lf",&x,&y,&x2,&y2);
===========
注意,跳过用 %*[^','] ,后面无 s1 。。。
读 用 %[^','] , 后面有 s1 。。。
其它问题也解决了。
第2个回答  2011-01-14
源代码说话

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

typedef struct
{
char time[20];
double Latitude_value;
char LatiNS;
double Longitude_value;
char LongiEW;
char GPSQuality[2];
int NumOfSat;
double AntennaHight;
double HorizontalDOP;
}GPS_INFO;

using namespace std;

int main()
{
GPS_INFO GPS;

char str[200]= "$GPGGA,102639.00,3906.89667,N,11720.83367,E,1,4,4.14,505.0,M,-2.3,M,,*7C";

sscanf(str,"$GPGGA,%[^,],%lf,%c,%lf,%c", GPS.time, &(GPS.Latitude_value), &GPS.LatiNS,&(GPS.Longitude_value), &GPS.LongiEW);

cout
<< GPS.time <<" "
<< setiosflags(ios::fixed) <<setprecision(6)
<< GPS.Latitude_value <<" "<< GPS.LatiNS << " " << GPS.Longitude_value << " "<< GPS.LongiEW << " "<< endl;

system("pause");

return 0;
}本回答被网友采纳

C++用SSCANF函数提取出现的问题
char s1[10],s2[10], s3[10];以逗号为分格符,要读一个字符串用:sscanf(str,"%[^','],%lf, %lf,%[^','],%lf,%[^','],%lf",s1,&x,&y,s2,&x2,s3,&y2);以逗号为分格符,跳过一个字符串用:sscanf(str,"%*[^','],%lf, %lf,%*[^','],%lf,%*[^','],%...

C++用SSCANF函数提取出现的问题
char s1[10],s2[10], s3[10];以逗号为分格符,要读一个字符串用:sscanf(str,"%[^','],%lf, %lf,%[^','],%lf,%[^','],%lf",s1,&x,&y,s2,&x2,s3,&y2);以逗号为分格符,跳过一个字符串用:sscanf(str,"%*[^','],%lf, %lf,%*[^','],%lf,%*[^','],%...

C++ sscanf 解析管道符分隔的字符串,遇到为空的后面就无法解析了。代码...
把匹配的格式改了一下,第五项解析空格 sscanf("02|04|5101|014| |20170205 104504|03|5101|034||20170205 104504", "%[^|]|%[^|]|%[^|]|%[^|]|%[ ]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]|%[^|]", szVehType, szLaneType, szNetId, szSta, szLane, szTime, ...

关于sscanf的问题
"%fl" 你写反了,是lf( long float)sscanf(...,"%lf\\t",d);可以读 具体你看下面的msdn吧 Read formatted data from a string. These functions are deprecated because more secure versions are available; see sscanf_s, _sscanf_s_l, swscanf_s, _swscanf_s_l.int sscanf(const char *...

c语言编程,关于sscanf通过中文逗号截取字符串的问题
37. sscanf(string, "%5s", buf1);38. printf("2.string=%s\\n", string);39. printf("2.buf1=%s\\n\\n", buf1);40. \/ 41. **执行结果:42. **2.buf1=12345 43. *\/ 44.45. \/*3.取到指定字符为止的字符串*\/ 46. string = "123\/456";47. ...

c++中sscanf函数与sprintf函数的用法
1、基本用法,取字符串 string source0 = "1234456"; char str[521]; sscanf(source0.c_str(),"%s",str); sscanf(source0.c_str(),"%4s",str);2、转换为整型数 string source0 = "123456"; int x; sscanf(source0.c_str(),"%d",&x); sscanf(source0.c...

用c++如何把下面字符串中的关键信息提取出来
namespace std;int main(void){ string str("#1 = AXIS2_PLACEMENT_3D ( 'NONE', #29, #44, #43 )"); int a[20]; char *p=(char *)str.c_str(); for(int n=0,j=0,i=0;p[i];i++) if(p[i]=='#'){ sscanf(p+i+1,"%d%n",a+j++,&n); ...

1、C\/C++如何实现在一个指定的文件中,提取指定的数字?如我在stdafx.h...
很 简单 先用 strstr 找到那行 然后 提取出来 用sscanf进行解析 后面的数字不知道的也可以提取出来 可以用 %d 代替 好吧 我也用 string 和 fstream类 还有 getline

c++用fread读取数据问题
可以建议这样:用fgets读取每一行的字符。然后用sscanf进行字符串解析,获取每行字符串的两个整数。假设FILE* fp=stdin;那么关键代码有:char buffer[88];for(int i=0;;++i) { if(fgets(buffer,88,fp)==NULL) \/\/读到文件末尾 break;sscanf(buffer,"%d %d",&a[i][0],&a[i][1]);} ...

C++,16进制转化问题,字符串转化成数字
char szValue[] = "01f0";int nValude = 0;sscanf(szValue,"%x",&nValude);printf("%d\\n",nValude);return 0;} 主要用到sscanf这个库函数:函数名: sscanf 功 能: 执行从字符串中的格式化输入 用 法: int sscanf(char *string, char *format[,argument,...]); ...

相似回答