我正在开发一个程序,用于转换用户给出的字符串中的某些字母,例如a = 4,e = 3等等。我想宣布我还是初学者而且我一直在寻找答案,但我找不到任何可以帮助我的事情。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void reemplazarLetras(string cadena);
void iterar(string cadena);
int main(){
string cadena;
do{
cout << "Escribe una cadena de texto de entre 5 y 50 caracteres" << endl;
getline(cin, cadena);
}while(cadena.length() < 5 || cadena.length() > 50);
iterar(cadena);
cout << "Tu nueva cadena transformada es: " << cadena << endl;
}
void reemplazarLetras(string cadena){
//Primero se reemplazan las vocales
cadena.replace(cadena.find("a"), 1, "4");
cadena.replace(cadena.find("e"), 1, "3");
cadena.replace(cadena.find("i"), 1, "1");
cadena.replace(cadena.find("o"), 1, "0");
//Despues se reemplazan las consonantes s y t
cadena.replace(cadena.find("s"), 1, "5");
cadena.replace(cadena.find("t"), 1, "7");
}
void iterar(string cadena){
for_each(cadena.begin(), cadena.end(), reemplazarLetras);
}
答案 0 :(得分:1)
在你的函数中iterar
参数cadena
是一个字符串。当您遍历该字符串时,您将遍历其字符。因此,C ++尝试将reemplazarLetras
应用于cadena
的每个字符(并且此类字符具有类型char
)。不幸的是,您的reemplazarLetras
函数不接受char
类型的参数:而是需要一个参数string cadena
。这导致C ++编译器抱怨。
答案 1 :(得分:0)
这是我的方式
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void reemplazarLetras(char c);
void iterar(string cadena);
string cadena;
int main(){
do{
cout << "Escribe una cadena de texto de entre 5 y 50 caracteres" <<endl;
getline(cin, cadena);
} while (cadena.length() < 5 || cadena.length() > 50);
iterar(cadena);
cout << "Tu nueva cadena transformada es: " << cadena << endl;
fflush(stdin);
cin.get();
}
void reemplazarLetras(char c){
//Primero se reemplazan las vocales
int x;
x = cadena.find("a");
if (x != -1)
cadena.replace(x, 1, "4");
x = cadena.find("e");
if (x != -1)
cadena.replace(cadena.find("e"), 1, "3");
x = cadena.find("i");
if (x != -1)
cadena.replace(cadena.find("i"), 1, "1");
x = cadena.find("o");
if (x != -1)
cadena.replace(cadena.find("o"), 1, "0");
x = cadena.find("s");
if (x != -1)
cadena.replace(cadena.find("s"), 1, "5");
x = cadena.find("t");
if (x != -1)
cadena.replace(cadena.find("t"), 1, "7");
}
void iterar(string cadena){
for_each(cadena.begin(), cadena.end(), reemplazarLetras);
}
答案 2 :(得分:0)
我认为这是解决问题的更好方法
顺便说一句,你应该避免在代码中使用全局变量。
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
void replaceVowelsWithNumbers(string &cadena,const unordered_map<char,char> &map){
transform(cadena.begin(),cadena.end(),cadena.begin(),
[&map](char&c)-> char{return map.find(c)!=map.end() ? map.find(c)->second : c;});
}
int main(){
unordered_map<char,char>letters;
letters['a']='1';
letters['e']='2';
letters['i']='3';
letters['o']='4';
letters['u']='5';
string cadena;
getline(cin,cadena);
replaceVowelsWithNumbers(cadena,letters);
cout<<cadena<<endl;
return 0;
}