C语言读取特定格式GPS坐标输入的报错问题咨询
解决GPS坐标输入的scanf/scanf_s问题
核心问题分析
你的代码存在两个关键错误:
- 输入格式匹配逻辑错误:输入的
54.2333是完整浮点数,你用%d.%d拆分读取的方式不符合scanf的匹配规则,应该直接读取为浮点数。 - 使用
scanf_s时未满足其安全参数要求,导致触发调试断言失败。
解决步骤
1. 修正输入格式与变量类型
GPS坐标的小数部分是分钟的十进制形式,直接用浮点数类型存储更合理,后续转十进制度数也更便捷。将原代码中的int s, f替换为double minutes_decimal(或float),格式字符串改为%d %c %lf(对应double类型)。
2. 处理scanf的安全警告
Windows VS环境下的C4996警告有两种解决方式:
方式一:禁用安全警告
在代码最开头添加宏定义,直接使用标准scanf:
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { int degrees; char dir; double minutes_decimal; printf("enter coordinates: "); scanf("%d %c %lf", °rees, &dir, &minutes_decimal); // 转换为十进制度数:度 + 分的小数部分/60 double decimal_degree = degrees + minutes_decimal / 60.0; // 南纬/西经转为负数 if (dir == 'S' || dir == 'W') { decimal_degree = -decimal_degree; } printf("十进制坐标:%.6f\n", decimal_degree); return 0; }
方式二:正确使用scanf_s
scanf_s对%c、%s等格式要求额外传入缓冲区大小参数,防止溢出。修正后的代码:
#include <stdio.h> int main() { int degrees; char dir; double minutes_decimal; printf("enter coordinates: "); // %c需要额外传入缓冲区大小(单个字符传1即可) scanf_s("%d %c %lf", °rees, &dir, 1, &minutes_decimal); double decimal_degree = degrees + minutes_decimal / 60.0; if (dir == 'S' || dir == 'W') { decimal_degree = -decimal_degree; } printf("十进制坐标:%.6f\n", decimal_degree); return 0; }
原scanf_s触发断言错误的原因
你之前使用scanf_s时,没有给%c格式传递缓冲区大小参数。scanf_s作为安全增强版函数,要求字符类输入必须指定最大可读取长度,否则会触发调试断言失败,这是它的强制安全检查机制。
内容的提问来源于stack exchange,提问作者LostITguy
相关产品推荐
相关产品推荐

