You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:33:22