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

我是否误解了C++ std::string::find_first_not_of的语义?

你确实误解了find_first_not_of()的参数语义,踩了这个函数非常常见的重载使用误区。

你调用的三参数重载签名为:

size_type find_first_not_of(const char* s, size_type pos, size_type count) const noexcept;

绝大多数人第一次用这个重载都会搞错第三个参数的含义:它根本不是用来指定从原字符串的pos位置开始往后检查多少个字符,而是指定取传入的字符集指针s指向内容的前count个字符,作为本次匹配的合法字符集合。

你代码里给count传了1,相当于本次用于判断的合法字符只有option_name_valid_chars指向字符串的第一个字符,也就是大写A。而你的token首字符是小写a,根本不在这个只包含A的合法集里,函数直接返回位置0是完全符合标准语义的结果,没有任何问题。

如果你要使用你预先定义的完整合法字符集(大小写字母、数字、下划线、短横线)做检查,直接去掉第三个参数就行,让函数自动识别C字符串的完整长度:

auto pos = token.find_first_not_of(option_name_valid_chars, 0);

这时候因为abc三个字符都属于合法字符,返回值就会是你预期的std::string::npos。

补个通用提醒:std::string的find、find_first_of、find_first_not_of、find_last_of、find_last_not_of这一整组查找函数,只要重载形式是「const char* + 起始位置 + count」,count参数永远是修饰传入的C风格字符集的长度,和被搜索的原字符串的搜索范围长度没有任何关系,这个坑踩过的人非常多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:24:15