C++如何使用string指针?实现字符串反转功能时报错如何解决?
C++ string指针实现字符串反转问题解答
错误原因
- 核心问题为运算符优先级使用错误:C++中
[]下标运算符优先级高于*解引用运算符,你代码中写的*str[start++]会被编译器解析为*(str[start++]) - 你定义的
str是std::string类型的指针,str[start++]的语义是从str指向的内存地址偏移start个std::string对象长度的位置,读取到的是std::string类型对象,该类型没有重载解引用运算符,因此触发no match for ‘operator*’的报错。
可行实现方案
方案1:保留指针入参的修复版本
仅需要调整解引用和下标的运算顺序即可,无需修改入参类型、也不需要转为字符数组:
void reverse(string* str, int size) { int start = 0; int end = size - 1; while(start < end) { // 先对指针解引用拿到string对象,再取下标访问对应位置的字符 swap((*str)[start++], (*str)[end--]); } } int main() { string str = "Something"; reverse(&str, str.length()); cout << "Reversed string: " << str << endl; return 0; }
方案2:更符合C++开发规范的实现(推荐)
实际开发中优先使用引用传递替代裸指针传递需要修改的对象,可以规避指针操作的语法风险、也无需额外判断空指针:
// 入参改为string的左值引用,可直接调用对象的size()接口,不需要额外传长度 void reverse(string& str) { int start = 0; int end = str.size() - 1; while(start < end) { swap(str[start++], str[end--]); } } int main() { string str = "Something"; reverse(str); cout << "Reversed string: " << str << endl; return 0; }
如果不需要自己实现反转逻辑,可以直接调用STL标准库的reverse接口,仅需要引入<algorithm>头文件即可:
#include <iostream> #include <string> #include <algorithm> using namespace std; int main() { string str = "Something"; reverse(str.begin(), str.end()); cout << "Reversed string: " << str << endl; return 0; }
内容的提问来源于stack exchange,提问作者Adinath Kolhapure
相关产品推荐
相关产品推荐

