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

如何用sscanf无循环提取字符串单词?避免修改源字符串

用sscanf实现不修改源字符串、无循环的多单词提取

当然可以用sscanf搞定这个需求!你现在的问题出在转换说明符的写法上,咱们一步步来修正:

原代码的问题

你写的%[^|]s是错误的——%[^|]本身就是一个完整的转换说明符,它会读取所有不等于|的字符,直到遇到|或者字符串结束。后面额外加的s会让sscanf试图匹配一个字面量的s字符,但你的源字符串里根本没有这个字符,导致后续的匹配全部失败,所以word2和word3才会是空的。

修正后的代码

把多余的s去掉就可以正常工作了,甚至可以加上长度限制避免缓冲区溢出(毕竟你的word数组是10个元素,要给字符串终止符留位置):

#include <stdio.h>

int main() {
    char source[] = "XXX|YYY|ZZZ";
    char word1[10] = "";
    char word2[10] = "";
    char word3[10] = "";
    
    // 用%9[^|]限制读取长度,避免缓冲区溢出
    sscanf(source, "%9[^|]|%9[^|]|%9s", word1, word2, word3);
    
    printf("word1: %s\nword2: %s\nword3: %s\n", word1, word2, word3);
    return 0;
}

代码解释

  • %9[^|]:读取最多9个非|的字符,刚好填满word数组(最后一个位置留给\0)
  • 中间的|是字面量匹配,sscanf会跳过源字符串中的|字符,继续读取下一段内容
  • 最后一个用%9s是因为最后一段后面没有|,%s会读取直到空白符或字符串结束,同样加长度限制更安全

这样运行后就能正确提取出XXX、YYY、ZZZ三个单词,而且完全不会修改源字符串,也不需要循环~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:08:06