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
相关产品推荐
相关产品推荐

