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

C++中如何提取char数组里圆点分隔后的后半段字符串?

获取"name.property"中的属性部分的几种方法

你遇到的问题是因为strtok的工作机制:第一次调用它会返回第一个分隔符前的内容,想要拿到圆点后的属性部分,只需要多调用一次就行,当然还有更直接的方法,下面给你两种可行的方案:

方案1:正确使用strtok

strtok第一次调用后,会记住上次处理的位置,第二次传NULL就能继续获取下一个分隔后的片段。修改你的代码如下:

if (strcmp(objectName, "") != 0) { 
    char fullName[32]; 
    char *unusedPart; // 用来存前面的test/name部分,我们不需要它
    char *propertyPart;
    sprintf(fullName, "test/%s", objectName); 
    // 第一次调用,拿到圆点前的部分(test/name)
    unusedPart = strtok(fullName, "."); 
    // 第二次传NULL,继续从上次的位置分割,拿到圆点后的属性
    propertyPart = strtok(NULL, "."); 
    // 一定要加判断,避免objectName里没有圆点导致空指针
    if (propertyPart != NULL) {
        sprintf(payload, "%s, %.5f,%.5f", propertyPart, x, y); 
        mqttPublishMessage(payload, propertyPart ); 
    }
}

注意:strtok会修改原字符串,它会把分隔符替换成\0,所以fullName在调用后会变成"test/name\0property",如果之后还需要用到完整的fullName,这个方法就不太合适。

方案2:用strchr直接定位圆点(更安全)

如果你不想修改原字符串,用strchr查找第一个圆点的位置是更好的选择,代码更简洁,也不会破坏原数据:

if (strcmp(objectName, "") != 0) { 
    char fullName[32]; 
    char *dotPosition;
    char *propertyPart;
    sprintf(fullName, "test/%s", objectName); 
    // 找到第一个'.'的指针
    dotPosition = strchr(fullName, '.'); 
    if (dotPosition != NULL) {
        // 圆点的下一个地址就是属性部分的起始
        propertyPart = dotPosition + 1;
        sprintf(payload, "%s, %.5f,%.5f", propertyPart, x, y); 
        mqttPublishMessage(payload, propertyPart ); 
    }
}

如果你的objectName可能包含多个圆点(比如name.sub.property),想拿到最后一个圆点后的内容,可以把strchr换成strrchr,它会查找最后一个匹配的字符。

额外提醒

  • 始终要判断分割后的propertyPart不为NULL,防止objectName没有圆点的情况导致程序崩溃;
  • 注意fullName的32字节大小限制,如果拼接后的字符串长度超过31(留一个字节给\0),会触发缓冲区溢出,建议根据实际情况调整大小,或者用更安全的snprintf代替sprintf。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:12:26