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

C语言字符串匹配verify函数中for与while运行原理咨询

代码整体功能

这段verify函数的作用是不区分大小写判断长字符串name中是否包含目标子串name_verify,匹配成功返回1,未匹配则后续返回0(你贴的代码片段缺少默认返回逻辑)。
首先进入逻辑前会先判断name的长度是否大于等于name_verify,如果name本身更短,不可能包含目标子串,直接跳过后续比对。


for循环逻辑

for(i=0; i<=(strlen(name) - strlen(name_verify)) ; i++)

这里的i是name中待比对子串的起始偏移量:

  • 假设name长度是10,name_verify长度是3,那么i的取值范围是0~7。因为从位置7开始往后取3个字符刚好到name的末尾,要是i大于7,剩下的字符长度不足,不需要做无效比对。
  • 每次循环中p=&name[i];会把指针p指向name的第i个字符,也就是本次待比对子串的起始位置。

while循环逻辑

while(k!=strlen(name_verify))
{
    temp[k] =* (p + k);
    k++;
}
temp[k]='\0';

这段的作用是把p指针往后连续strlen(name_verify)个字符拷贝到临时数组temp中,生成待比对的子串:

  • 比如本次i取值为2,name_verify长度是3,就会依次把name[2]、name[3]、name[4]三个字符存到temp[0]、temp[1]、temp[2]里。
  • 最后给temp末尾加上字符串结束符\0,把temp转为合法的C字符串。

后续比对逻辑

子串拷贝完成后,调用strupr把temp和name_verify都转为大写,再用strcmp比对是否完全相等:如果相等就说明匹配成功,直接返回1;如果不相等就进入下一轮for循环,比对下一个起始位置的子串。


注意:这段代码存在数组越界bug

临时数组temp的定义是temp[strlen(name_verify)],长度刚好等于name_verify的长度,但后续还要额外存一个结束符\0,会超出数组边界,正确的写法应该是temp[strlen(name_verify)+1]。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:09:00