cstring越界_c++用string字符串再用substr函数出现内存越界,有什么解决方法

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

为方便大家查看,把代码贴出来。

我知道fgo吧老哥人均MIT,嘻嘻

2230ca542fc80234d5eded7204cdddf1.png

#include

#include

#include

using namespace std;

void Pickup(string *Store,string *A,string *B,int); //将输入的字符串分别赋值给A和B

void DeleteTheSame(string *X,int); //删除string里重复的字符串

void DeleteAFromB(string *A,string *B,int); //将B中与A重复的字符串删除

void Putout(string *M,int); //输出字符串

int main()

{

string *Q[15],*W[15],*E[15];

string Store[15],A[15],B[15];

for (int i=0;i<15;++i){

Q[i]=&Store[i],W[i]=&A[i],E[i]=&B[i];} //给字符串指针赋值首地址

for (int i=0;i<15;++i){

Q[i]=new string[30];W[i]=new string[15];E[i]=new string[15];

}

int n=0;

cout << "请按A->B的格式输入单词和单词串。" << endl;

cout << "请输入行数:(不要超过15)";

cin >> n;

for (int i=0;i

{cout << "请输入第" << i+1 << "行:";

getline(cin,Store[i]);

}

Pickup(*Q,*W,*E,n);

DeleteTheSame(*W,n);

DeleteTheSame(*E,n);

DeleteAFromB(*W,*E,n);

Putout(*W,n);

Putout(*E,n);

return 0;

}

void Pickup(string *Store,string *A,string *B,int n)

{

for (int i=0;i

int a=Store[i].find('-'); //检测‘->’符号所在位置

A[i]=Store[i].substr(0,a-1); //把->符号前的字符串赋给A

B[i]=Store[i].substr(a+2); //把->符号后的字符串赋给B

}}

void DeleteTheSame(string *X,int n)

{

for (int i=0;i

{ if(X[i].empty()) continue; //如果字符串为空,跳过,到下一组

for (int j=i+1;j

{if (X[i]==X[j]) X[j].erase (X[j].begin(), X[j].end());} //检查字符串里是否有重复的,有就删除

}

}

void DeleteAFromB(string *A,string *B,int n)

{

for (int i=0;i

{ if(A[i].empty()) continue; //先检查A的子字符串是否为空

for (int j=0;j

{if (A[i]==B[j]) B[j].erase(B[j].begin(), B[j].end());} //检查B字符串是否和A字符串重复,是的话删除。

}}

void Putout(string *M,int n)

{

for (int i=0;i

}

下面是运行示例;

请按A->B的格式输入单词和单词串。

请输入行数:(不要超过15)2

请输入第1行:请输入第2行:fgo->nb

terminate called after throwing an instance of 'std::out_of_range'

what(): basic_string::substr: __pos (which is 1) > this->size() (which is 0)

而且会出现第一行无法输入,怎么办呀

3546c8f94fbd2f518df6f1624b444f7f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值