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
相关产品推荐
相关产品推荐

