为什么我收到此错误? [错误]来自' char'的无效转换到#char; char *' [-fpermissive]

时间:2017-02-20 19:04:14

标签: c++ string replace

我正在开发一个程序,用于转换用户给出的字符串中的某些字母,例如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);   
 }

3 个答案:

答案 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;
}