C++删除字符串字符函数返回值无输出问题及解决方法
问题分析与解决
问题原因
你的代码核心问题在于空字符串直接通过索引赋值的未定义行为:
- 初始化的
newS是空字符串,长度为0,C++的std::string的operator[]不会自动扩展存储空间,直接访问newS[j](初始j=0)属于越界访问内存,这会导致字符串无法正确构建,最终输出为空(甚至可能引发程序崩溃)。 - 此外代码未对输入的
position做合法性检查,如果position超出原字符串的索引范围(比如原字符串长度为4,合法索引是0~3),会引发额外的错误。
修复方案
方案一:使用push_back安全添加字符
直接调用string的push_back方法向空字符串中添加字符,该方法会自动管理字符串的存储空间,无需手动维护索引j:
#include <iostream> #include <string> using namespace std; string deletion(string s, int position) { string newS; int i = 0, sLen = s.length(); // 先检查position合法性 if (position < 0 || position >= sLen) { return s; // 非法位置直接返回原字符串 } while(sLen != 0) { if(i != position) { newS.push_back(s[i]); // 改用push_back添加字符 } i++; sLen--; } return newS; } int main() { cout << deletion("abcd", 2) << endl; // 输出应为"abd" return 0; }
方案二:预分配字符串空间(可选)
如果想提前分配足够的存储空间,可以先初始化newS为目标长度的字符串,再通过索引赋值:
#include <iostream> #include <string> using namespace std; string deletion(string s, int position) { int sLen = s.length(); // 检查position合法性 if (position < 0 || position >= sLen) { return s; } string newS(sLen - 1, '\0'); // 预分配sLen-1长度的空间 int i = 0, j = 0; while(i < sLen) { if(i != position) { newS[j] = s[i]; j++; } i++; } return newS; } int main() { cout << deletion("abcd", 2) << endl; // 输出"abd" return 0; }
方案三:直接使用string内置的erase方法(更简洁)
如果不需要手动实现删除逻辑,std::string自带的erase方法可以直接完成需求:
#include <iostream> #include <string> using namespace std; int main() { string s = "abcd"; int position = 2; if (position >=0 && position < s.length()) { s.erase(position, 1); // 从position位置删除1个字符 } cout << s << endl; // 输出"abd" return 0; }
内容的提问来源于stack exchange,提问作者Satyajit Roy
相关产品推荐
相关产品推荐

