如何去除DMS坐标输出的前导零并维持两位宽度对齐?
解决DMS坐标格式化:去前导零且保持对齐
核心问题在于你之前直接用字符串输出分秒时,要么保留前导零(%2s),要么丢失对齐效果(%1s)。解决思路是先把读取到的分、秒字符串转换成整数,再通过整数格式化实现去前导零+固定宽度对齐的双重需求。
具体步骤和代码示例
读取并转换数据:
先用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);处理方向字符:
把单个字符的方向标识(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"); // 处理未知方向 }格式化输出:
使用整数格式化符%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
相关产品推荐
相关产品推荐

