C语言子串匹配指针代码调试求助:OJ得94分,求找bug及测试用例
子串匹配代码的潜在Bug及测试用例分析
核心Bug分析
1. 空指针检查时机错误
代码在malloc分配内存后,先执行scanf再检查s和t是否为NULL。若malloc失败返回NULL,scanf向NULL指针写入数据会触发未定义行为(程序直接崩溃)。正确逻辑是分配内存后立即检查有效性,确认成功后再执行输入操作。
2. 空子串处理逻辑错误
当子串t为空字符串时,*ptrT初始即为'\0',会直接进入匹配成功分支,循环打印当前ptrS的位置直到结束。这不符合常规子串匹配规则(空串应匹配所有起始位置,包括字符串末尾之后的位置),且输出逻辑混乱,无法通过OJ的特殊用例检测。
3. 匹配逻辑核心错误:未正确回退起始位置
代码未遵循暴力匹配的基本回退规则:当部分匹配失败时,需将ptrS回退到本次匹配起始位置的下一个位置,再重置ptrT重新匹配。但当前代码仅在匹配成功时回退ptrS,匹配失败时直接在当前ptrS位置重置ptrT并继续前进,导致跳过大量可能的起始位置,出现漏匹配。
触发Bug的测试用例
测试用例1:空子串t
输入:
hello
(s为"hello",t为空字符串)
代码输出:0 1 2 3 4,但常规判定中空串应匹配起始位置0-5(含字符串末尾),此输出不符合要求。
测试用例2:部分匹配后需回退的场景
输入:
ababababac ababac
正确输出应为4,但代码因未回退到起始位置4进行匹配,无任何输出,直接漏过正确结果。
测试用例3:malloc失败场景(模拟)
在内存不足环境下运行代码,或手动修改malloc返回NULL,程序会因scanf写入NULL指针直接崩溃。
修复建议
- 调整空指针检查顺序:在
malloc后立即检查s和t是否为NULL,失败则释放已分配内存并退出。 - 新增空子串处理逻辑:若
t为空,直接输出所有起始位置(0到s的长度)或按OJ要求处理。 - 重构匹配逻辑:改为标准暴力匹配逻辑,记录每次匹配的起始位置,失败时回退到起始位置+1,重置
ptrT重新匹配。
内容的提问来源于stack exchange,提问作者Elliott T
相关产品推荐
相关产品推荐

