统计长度为2的子串出现次数,同逻辑C语言失效Python正常求原因
C语言代码存在的问题
- s2数组长度不足:C语言字符串以
\0作为结束标志,你定义s2长度为2,使用gets()读入2个字符的子串时,函数会自动在末尾追加\0,导致数据写入到s2数组外的内存空间,属于缓冲区溢出的未定义行为,会直接篡改内存中其他变量的值(比如s1的内容、count计数),最终得到错误结果。s2的长度至少要设置为3,预留结束符的存储位置。 - 循环边界越界:当前循环条件为
i<strlen(s1),当i取值为strlen(s1)-1时,i+1等于字符串长度,访问s1[i+1]会读到字符串末尾的\0,甚至触发越界访问。正确的循环边界应该是i < strlen(s1)-1,保证每次取相邻两个字符都不会超出s1的有效范围。 - 使用了不安全的gets函数:
gets()不会检查输入内容的长度,只要输入内容超过数组容量就会触发缓冲区溢出,该函数已经被C11标准正式废弃,建议替换为fgets()来读入字符串。
修正后的C代码
#include<stdio.h> #include<string.h> int main() { char s1[100], s2[3]; // 调整s2长度预留结束符位置 int count = 0; // 用fgets替代gets,手动去除末尾换行符 fgets(s1, sizeof(s1), stdin); s1[strcspn(s1, "\n")] = '\0'; fgets(s2, sizeof(s2), stdin); s2[strcspn(s2, "\n")] = '\0'; // 调整循环边界避免越界 for(int i=0; i < strlen(s1)-1; i++) { if(s1[i] == s2[0] && s1[i+1] == s2[1]) { count++; } } printf("%d",count); return 0; }
内容的提问来源于stack exchange,提问作者Sricharan
相关产品推荐
相关产品推荐

