vs下sscanf_s报错

在一次使用sscanf_s解析GPS报文时报错

Run-Time Check Failure #2 - Stack around the variable 'm_bGGASecond' was corrupted.

 

代码如下: 

DWORD dump;
int la,lo;
char ns,ew;

char m_bGGAHour;					
char m_bGGAMinute;					
char m_bGGASecond;					
double m_dGGALatitude;				
double m_dGGALongitude;				
char m_bGGAGPSQuality;				
char m_bGGANumOfSatsInUse;			
double m_dGGAHDOP;					
double m_dGGAAltitude;				


sscanf_s((char*)StrData, "%02d%02d%02d.%02d,"
	    "%02d%lf," "%c,"
	    "%03d%lf," "%c,"
	    "%d," "%02d," "%lf," "%lf",
	    &m_bGGAHour, &m_bGGAMinute, &m_bGGASecond, &dump,
	    &la, &m_dGGALatitude, &ns, 1,
	    &lo, &m_dGGALongitude, &ew, 1,
	    &m_bGGAGPSQuality,
	    &m_bGGANumOfSatsInUse,
	    &m_dGGAHDOP,
	    &m_dGGAAltitude
    );

 

经过反复调试发现为一低极错误.

%d在sscanf中解析为int , 而传入的参数为char!


 

### 关于 `__isoc99_sscanf` 的使用说明 `__isoc99_sscanf` 是 GNU C 库(glibc)中的一个内部实现函数,通常用于支持 ISO C99 标准下的 `sscanf` 函数。它是一个兼容性增强版本的扫描函数,能够处理一些特定的格式化输入需求[^4]。 #### 功能描述 该函数的主要功能是从字符串中读取数据并将其存储到指定变量中。它的行为类似于标准库中的 `sscanf` 函数,但在某些情况下提供了更严格的类型检查和更好的安全性。以下是其基本语法: ```c int __isoc99_sscanf(const char *str, const char *format, ...); ``` - 参数 `str` 表示要解析的输入字符串。 - 参数 `format` 是格式控制字符串,指定了如何解释输入数据。 - 可变参数列表表示接收解析结果的目标变量地址。 #### 使用注意事项 由于 `__isoc99_sscanf` 并不是标准 C 库的一部分,而是 glibc 提供的一个扩展,在跨平台开发时可能会遇到不兼容的情况。因此建议尽可能使用标准的 `sscanf` 来替代此函数,除非有特殊的需求需要依赖 glibc 扩展特性[^5]。 #### 编译错误解决方案 当尝试使用 `__isoc99_sscanf` 遇到编译器报错时,可以考虑以下几个方面来解决问题: 1. **确认编译选项**:确保编译过程中启用了 `-std=gnu99` 或更高版本的标准支持模式,因为这些扩展可能仅在 GnuC 特定环境下可用。 2. **链接正确的库文件**:有时即使包含了合适的头文件仍会缺失符号定义,则需验证是否正确连接了相应的动态/静态库。 3. **替换为标准接口**:如果只是为了完成简单的格式化输入操作而无需额外的功能改进,可以直接改用标准化后的 `sscanf` 方法代替以提高代码可移植性和稳定性[^6]。 下面给出一段示范性的例子展示如何运用此类技术进行实际编程实践: ```c #include <stdio.h> int main(void){ char buffer[50]; float number; strcpy(buffer,"Pi equals to 3.14"); /* Using sscanf */ if(__isoc99_sscanf(buffer,"%*s %f",&number)==1){ printf("Extracted Number:%f\n",number); } else{ fprintf(stderr,"Failed extraction!\n"); } return 0; } ``` 上述实例展示了通过调用 `__isoc99_sscanf` 实现从字符串提取数值的过程,并打印所获取的结果值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值