C++字符串后缀判断代码编译失败与逻辑错误排查求助
编译错误排查
- main函数中使用
string类型时未加std::前缀,你注释掉了using namespace std;,所以必须写全std::string,否则编译器无法识别string类型,这是编译失败的核心原因。 - 未引入
<string>头文件:部分编译器会依赖<iostream>间接引入string,但属于不规范写法,大概率会触发编译报错。 - 未做长度边界判断:当
ending长度大于str、或str为空串且ending非空时,调用str.at(str.length()-1)会触发数组越界异常,直接导致运行崩溃。
逻辑错误排查
你当前的思路完全不符合题目要求,存在两个核心错误:
- 错误使用取地址符
&:你写的&str.at(xxx) == &ending.at(xxx)是在对比两个字符的内存地址,不是对比字符的值。两个不同字符串的字符存储地址必然不同,哪怕字符值完全相等也会返回false,这就是Codewars返回结果和预期不符的直接原因。 - 只对比了末尾单个字符:题目要求判断第一个字符串整个尾部和第二个字符串完全匹配,你只对比最后一个字符逻辑完全错误,例如
"abc"和"xc"末尾字符都是c,但显然"abc"不以"xc"结尾。
注释理解错误纠正
- 函数参数里的
&str不是地址,是C++的引用语法,作用是避免字符串拷贝、提升执行效率,搭配const保证函数内部不会修改原字符串。 - 你对
str.length()-1是最后一个字符下标的理解是对的,但加上&之后就变成取最后一个字符的内存地址,和你预期的取字符值逻辑相悖。
可运行的修正代码参考
#include <iostream> #include <string> bool solution(std::string const &str, std::string const &ending) { // 边界情况1:结尾串为空直接返回true if (ending.empty()) { return true; } // 边界情况2:结尾串比原串长,不可能匹配 if (ending.size() > str.size()) { return false; } // 取原串最后和ending等长的子串,直接对比 return str.substr(str.size() - ending.size()) == ending; } int main() { std::string u = "true"; std::string y = "ue"; std::cout << std::boolalpha << solution(u, y) << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者octopus
相关产品推荐
相关产品推荐

