矢量没有推回去

时间:2015-09-26 16:27:31

标签: c++

我正在尝试制作一个将字符串翻译成猪拉丁语的程序。问题是程序在运行时停止运行。我认为问题是矢量“sary”没有推迟。这是我的代码:

#include <iostream>
#include <vector>
#include <string.h>

using namespace std;

char alfa[5]={'a','e','i','o','u'};

void vowDet(vector <string> vec, int ary[5], vector <char> sary){
for(int a=0;a<vec.size();a++){
for(int i=0;i<5;i++){
if(vec[a].find(alfa[i])!=string::npos){
    ary[i]=vec[a].find_first_of(alfa[i]);
}
else{ary[i]=1000;}
}
int hold;
for(int b=0;b<4;b++){
for(int c=b+1;c<5;c++){
    if(ary[b]>ary[c]){
        hold=ary[b];
        ary[b]=ary[c];
        ary[c]=hold;
        }
    }
}
sary.push_back(vec[a][ary[0]]); //possible source of error
}
}

int main(){
vector <string> vec (0);
string phrase,temp;
vector <char> sary (0);
cout<<"Enter a phrase to translate: ";
getline(cin,phrase);
phrase.push_back(' ');

int ary[5]={1000,1000,1000,1000,1000};
int count=0; 
do{
vec.resize(count+1);
temp=phrase.substr(0,phrase.find(" "));
vec[count].append(temp);
phrase.erase(0,phrase.find(" ")+1);
count++;
}while(phrase.find(" ")!=string::npos);

vowDet(vec,ary,sary);

for(int a=0;a<vec.size();a++){
for(int l=0;l<5;l++){
    if(vec[a][0]==alfa[l]){
        vec[a].append("way");
        goto end;
    }
}
int solve;
for(int g=0;g<5;g++){
    if(sary[a]==alfa[g]){
    solve=g;
    }
}

if(vec[a].find(alfa[solve])!=string::npos){
    temp=vec[a].substr(0,vec[a].find(alfa[solve]));
    vec[a].append(temp);
    vec[a].erase(0,vec[a].find(alfa[solve]));
}
vec[a].append("ay");
end:
cout<<endl<<vec[a]<<" ";
}
cout<<endl;
return 0;
}

2 个答案:

答案 0 :(得分:2)

您正在通过值传递sary ,该函数会获取调用方向量的副本。调用者不会看到函数中所做的任何更改。将其作为参考传递,以获得您想要的行为。

请注意,您还要按价值传递vec ,这会产生复制费用。您可以将vec作为 const引用传递,以避免复制并在函数中将其设置为只读,从而防止它改变调用者的向量。

void vowDet(const vector <string> &vec, int ary[5], vector <char> &sary)

答案 1 :(得分:0)

我没有阅读/理解整个代码,但这是可能的。 vector<char> sary按值传递,这意味着当您调用vowDet()时,将创建本地副本,并且您对其所做的任何更改将保持在本地,而不会影响创建本地的原始副本。尝试通过将声明更改为:

来通过引用传递
void vowDet(vector <string> vec, int ary[5], vector <char> &sary)