我无法解决这个我无法解决的爆破考试问题,Visual C ++ 2010一直告诉我:“表达式:字符串下标超出范围”。我认为我运行的循环时间长于“inStringP.length()”的长度,所以我添加了&从for循环的条件测试中的整数中减去1或2,但这不会成功。谷歌今天也没有感受到它通常的天才......
#include <iostream>
#include <cstdlib>
#include <string>
#include "stdAfx.h"
using namespace std;
string removeChar(string inStringP){
string temp;
for(int i=0;i<inStringP.length()-1;i++){
if(inStringP[i]!='p'){
temp[i]=inStringP[i];
}
}
return temp;
}
int main(){
string sample = "Peter picks a peck of pickled peppers";
cout<<removeChar(sample)<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
答案 0 :(得分:2)
您的应用程序崩溃是因为下面的语句没有为temp
分配任何元素,访问temp[0]
是未定义的行为。
string temp;
如果你想在removeChar函数中使用temp
,更好的方法是将const引用传递给inStringP
string removeChar(const string& inStringP){
}
通过这样做,当输入removeChar函数时,您不需要复制到inStringP。
更好的方法是关注erase-remove idiom:
尝试:
string removeChar(string inStringP)
{
return inStringP.erase(std::remove(sample.begin(), sample.end(), 'p'), sample.end());
}
答案 1 :(得分:1)
resize
temp
string temp;
temp.resize(inStringP.size());
如果您不知道开头的实际尺寸,可以append
,push_back
和operator+=
:
temp.append(1, inStringP[i]);
or
temp.push_back(inStringP[i]);
or
temp += inStringP[i];
答案 2 :(得分:0)
你能尝试使用string.erase()吗?
http://www.cplusplus.com/reference/string/string/erase/
迭代器版本将允许您删除一个字符...使用迭代器搜索字符串,然后使用erase函数删除它,该函数接受迭代器作为参数
编辑:看到billz的答案......非常好!答案 3 :(得分:0)
我会建议;
string removeChar(string inStringP){
string temp;
int len = inStringP.length();
for(int i = 0;i < len;i++){
if(inStringP[i] != 'p'){
temp.push_back(inStringP[i]);
}
}
return temp;
}
因为您的逻辑给出了无编译时错误,但它是运行时错误。您的代码实际上用作:
string temp;
temp[0] = 'P';
temp[1] = 'e';
temp[2] = 't';
temp[3] = 'e';
temp[4] = 'r';
temp[5] = ' ';
//s[6] = 'p';
temp[7] = 'i';
这是一个超出范围的错误。
答案 4 :(得分:0)
使用std::string
时,您也可以使用算术运算符。
你可以这样做,
for(int i=0;i<=inStringP.length();i++)
{
if(inStringP[i]!='p')
{
temp += inStringP[i];
cout<<temp<<endl;
}
}
我在g++ 4.6.3
上尝试了您的代码,它没有给出任何错误。然而,它给了
temp
循环结束时的空白for
;
使用temp[i] = inString[i]
编译器还没有temp
此外,如果您对i
和temp
使用相同的inStringP
假设我们处于字符e
,它将跳过if block
和+1 i
。相应的
temp
中的位置将保持不变。
此外,string.length()
会返回不包含\0