我正在尝试制作一个将字符串翻译成猪拉丁语的程序。问题是程序在运行时停止运行。我认为问题是矢量“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;
}
答案 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)