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

如何去除DMS坐标输出的前导零并维持两位宽度对齐?

解决DMS坐标格式化:去前导零且保持对齐

核心问题在于你之前直接用字符串输出分秒时,要么保留前导零(%2s),要么丢失对齐效果(%1s)。解决思路是先把读取到的分、秒字符串转换成整数,再通过整数格式化实现去前导零+固定宽度对齐的双重需求。

具体步骤和代码示例

  1. 读取并转换数据:
    先用fscanf读取字符串格式的坐标分量,再将分、秒转换为整数(前导零会被自动忽略):

    char buf[100]; // 假设buf是输入缓冲区
    char d_str[4], m_str[3], s_str[3], c[2];
    int deg, min, sec;
    
    // 读取原始DMS格式数据(比如"1134510W"或"1450309N")
    fscanf(buf, "%3s%2s%2s%s", d_str, m_str, s_str, c);
    
    // 转换为整数,自动去除前导零
    deg = atoi(d_str);
    min = atoi(m_str);
    sec = atoi(s_str);
    
  2. 处理方向字符:
    把单个字符的方向标识(W/N/E/S)转换成完整名称:

    char dir[6];
    if (strcmp(c, "W") == 0) {
        strcpy(dir, "West");
    } else if (strcmp(c, "N") == 0) {
        strcpy(dir, "North");
    } else if (strcmp(c, "E") == 0) {
        strcpy(dir, "East");
    } else if (strcmp(c, "S") == 0) {
        strcpy(dir, "South");
    } else {
        strcpy(dir, "Unknown"); // 处理未知方向
    }
    
  3. 格式化输出:
    使用整数格式化符%3d(经度,固定3位宽度)、%2d(分、秒,固定2位宽度),这样:

    • 两位数字(如45、10)会直接占满宽度
    • 一位数字(如3、9)会自动在左侧补空格,实现对齐且无前列零
    sprintf(buf, "%3dd %2dm %2ds %s", deg, min, sec, dir);
    

效果验证

对于输入1134510W,输出为:113d 45m 10s West
对于输入1450309N,输出为:145d 3m 9s North
完全符合你要的对齐+去前导零的需求。

内容的提问来源于stack exchange,提问作者cap

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:32:53