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

C语言用strtok解析逗号分隔GPRMC字符串无输出问题求助

你的代码存在3个核心问题

  • 字符串写入只读内存触发未定义行为
    strtok执行时会修改原字符串,将匹配到的分隔符替换为\0实现分割。你在main中定义的char* gprmc = "xxx"是指向只读常量区的指针,该区域禁止写入,运行时会出现段错误、无输出等异常情况,需要改为栈上可写的字符数组:char gprmc[] = "$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,,,E*62";
  • strtok调用逻辑错误
    strtok首次分割需要传入原字符串指针,后续继续分割同一字符串必须传入NULL作为第一个参数,函数会通过内部静态变量记录上次分割的结束位置。你循环中每次都重新传入原字符串指针,导致每次都从字符串开头重新分割,永远只能拿到第一个片段,甚至触发死循环。
  • strtok原生不支持空字段识别
    连续出现的分隔符会被strtok默认合并为单个分隔符处理,两个逗号中间的空值会被直接跳过,无法满足你保留空片段的输出要求。

修正后的可运行代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void parseGprmc(char* gprmc) {
    char *start = gprmc;
    char *curr;
    // 遍历字符串手动按逗号分割,支持空字段
    for (curr = gprmc; *curr; curr++) {
        if (*curr == ',') {
            *curr = '\0';
            printf("%s\n", start);
            start = curr + 1;
        }
    }
    // 打印最后一个片段
    printf("%s\n", start);
}

int main() {
    // 改为可写的字符数组
    char gprmc[] = "$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,,,E*62";

    printf("%s\n", gprmc);
    parseGprmc(gprmc);
    // 注意原字符串已经被修改,如果需要保留原串可以提前拷贝一份
    return 0;
}

上述代码会完全输出你预期的结果,包括两个逗号中间的空行。如果需要保留原字符串不被修改,可以在分割前先将原串拷贝到临时缓冲区再操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 09:27:03