C语言子串包含判断程序输出异常,请求错误排查
问题分析与代码修正
我帮你找出了代码里的几个关键问题,咱们一步步来修正:
错误点拆解
循环条件不正确:
原循环的终止条件是i < str1len - str2len,这会漏掉最后一个可能的子串位置。比如当str1长度为5,str2长度为2时,str1len - str2len = 3,合法的起始索引应该是0、1、2、3(共4个位置),但原条件会让循环在i=3时停止,错过最后一次匹配检查。正确的条件应该是i <= str1len - str2len。strncpy未添加字符串终止符:strncpy函数不会自动在复制的字符末尾添加'\0',而strcmp要求操作的是以'\0'结尾的合法C字符串。如果不手动添加终止符,sub1里会包含内存中的垃圾数据,导致strcmp的比较结果完全不可靠。复制后需要手动执行sub1[str2len] = '\0';。循环内的逻辑混乱:
现在的代码不管第一次循环有没有匹配成功,都会直接输出false并退出程序,这意味着程序只检查了第一个子串就结束了。正确的逻辑应该是:找到匹配时立即输出true并返回;如果循环完整执行完都没找到匹配,再输出false。
修正后的代码
#include <stdio.h> #include <string.h> int main(int argc, char **argv){ // 先检查参数数量是否正确,避免无参导致崩溃 if (argc != 3) { printf("请传入两个字符串参数\n"); return 1; } char *str1 = argv[1]; char *str2 = argv[2]; int str1len = strlen(str1); int str2len = strlen(str2); if (str2len > str1len){ printf("false\n"); return 0; } char sub1[100]; for (int i = 0; i <= str1len - str2len; i++){ strncpy(sub1, str1 + i, str2len); // 手动添加字符串终止符,保证strcmp能正常工作 sub1[str2len] = '\0'; if (strcmp(sub1, str2) == 0){ printf("true\n"); return 0; } } // 循环结束未找到匹配,输出false printf("false\n"); return 0; }
另外我还加了参数数量的检查,避免用户忘记传参数导致程序崩溃,这个小细节能让程序更健壮~
内容的提问来源于stack exchange,提问作者nadia
相关产品推荐
相关产品推荐

