You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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", &degrees, &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", &degrees, &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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:00:49