知识点体系逻辑图 · 陶老师 C++ 编程课堂
| 对比项 | 有重叠计数 | 无重叠计数 |
|---|---|---|
| 找到一个子串后 | i++(继续下一位) | i += m(跳过m位) |
| s="aaaa", p="aa" | 结果=3 | 结果=2 |
| 循环写法 | for正常i++ | for+手动i+=m |
| 典型应用 | 统计出现次数 | 消消乐、替换 |
s.substr(0, 5) 期望得到"前5个字符到位置5",结果截取的是从位置0开始的5个字符。substr(起始位置, 长度),第二个参数是截取的字符个数,不是结束下标。学生容易和Python切片 s[0:5] 混淆。substr(i, len) = 从位置i开始,截取len个字符。如果想截到末尾,只传一个参数:s.substr(i)。i += m 跳过m个字符,否则 i++。用表格对比记忆!s.replace(0, 3, "XX") 后,再访问 s[3] 得到的不是预期字符,甚至越界崩溃。i <= s.size() 或 i < s.size() - 1,多访问了一位或少访问了一位。字符串下标从0开始,最后一个字符下标是 s.size()-1。for(int i = 0; i < s.size(); i++),左闭右开,天然不会越界。截取子串时检查 i + m <= s.size()。expected '}' at end of input,但去看第19行根本没问题。expected '}'),真实错误通常在报错行往上数几行。学会从报错信息中提取关键关键词。cout << "调试: i=" << i << " s=" << s << endl;,看哪一步开始偏离预期。一次只改一个地方,改完立刻运行对比。char c = "a"; 或 string s = 'hello';,编译报错或结果异常。'a' 表示一个字符(char类型),双引号 "a" 表示一个字符串(const char*类型)。学生经常混用引号。char c = 'a';;string 用双引号:string s = "hello";。一个字符=单引号,一串字符=双引号!for(int i = s.size() - 1; i >= 0; i--) 倒序遍历,结果死循环或直接跳过。s.size() 返回的是 unsigned int(无符号数),永远 >= 0。当 i 减到 -1 时,和无符号数比较会被隐式转换成巨大正数,循环停不下来。int n = s.size(); for(int i = n - 1; i >= 0; i--)。或者正序遍历更安全:for(int i = 0; i < (int)s.size(); i++)。