strtok两个连续分隔符当作一个提取的问题,字符分割线程安全性

本文探讨了C语言中strtok函数的线程安全性问题,并介绍了如何处理含有连续分隔符的字符串,以确保正确分割。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.strtok是c的一个字符串分割函数,由于使用了一个全局static变量,所以它是线程不安全的.
 
2.当风格"a,,b,c"这样的两个分隔符挨着的字符串时候,会得到a、b、c三个字符,而不是a、空字符、b、c
 
3.解决办法就是将连续的分割替换成比如:Replace(",,",",|,"),然后再使用strtok字符分割函数。那么会得到:
 
 a、|、b、c,然后判定下字符是不是|,替换成空字符就是了。
 
4.如果存在,,,,这样多个连续分隔符,那么就多使用几次Replace(",,",",|,")就好了。
void get_posa(char *str) { uint16_t i = 0; uint16_t j = 0; char *string = NULL; char *cs = NULL; double q_height = 0; double roll = 0; double pitch = 0; double azimuth = 0; char *after = strchr(str, '*'); if (after != NULL) { *after = '\0'; } char *copy = strdup(str); char *token; token = strtok(copy, ";"); if (token != NULL) { token = strtok(NULL, ""); if (token != NULL) { // printf("分号后的内容: %s\n", token); char *subtoken = strtok(token, ","); while (subtoken != NULL && i < 19) { // printf("%s\n", subtoken); switch (i) { case 0: if (subtoken != NULL) { // INS 解算状态 printf("解算状态:%s", subtoken); } break; case 1: if (subtoken != NULL) { // 位置信息类型 // printf("位置信息类型:%s", subtoken); } break; case 2: if (subtoken != NULL) { // 维度 printf("纬度: %s", subtoken); g_lat = strtod(subtoken, &cs); } break; case 3: if (subtoken != NULL) { // 经度 printf("经度:%s", subtoken); g_lon = strtod(subtoken, &cs); } break; case 4: if (subtoken != NULL) { // 海拔高 printf("高度:%s\n", subtoken); history_height = strtod(subtoken, &cs); } break; case 5: if (subtoken != NULL) { // 高异常值 q_height = strtod(subtoken, &cs); // printf("X角:%s\n", subtoken); } break; case 10: if (subtoken != NULL) { // ROLL 横滚角对应字符串的输出 roll = strtod(subtoken, &cs); // printf(" 横滚角:%s", subtoken); } break; case 11: if (subtoken != NULL) { // Pitch 俯仰角对应字符串的输出 pitch = strtod(subtoken, &cs); // printf(" 俯仰角:%s", subtoken); } break; case 12: if (subtoken != NULL) { // Azimuth 航向角对应字符串的输出 azimuth = strtod(subtoken, &cs); // printf("航向角:%s", subtoken); } break; case 18: if (subtoken != NULL) { // 扩展解算状态 // printf("航向角:%s", subtoken); } break; default: break; } subtoken = strtok(NULL, ","); i++; } } } } 不改变代码的功能只把里边的strtok改变
04-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值