2017-02-20 37 views
-3

Я работаю над программой, которая преобразует определенные буквы из строки, заданной пользователем, например a = 4, e = 3 и так далее на. Я хочу заявить, что я все еще новичок, и я искал ответ, но я не могу найти ничего, что помогло бы мне.Зачем нужна эта ошибка? [Ошибка] неверное преобразование из 'char' в 'const char *' [-fpermissive]

#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

Непонятно, почему 'iterar' нуждается в цикле, поскольку параметр представляет собой одну строку, а' reemplazarLetras' требует одну строку. –

+0

[Обязательно об этом сообщении об ошибке?] (Http://coliru.stacked-crooked.com/a/072a7c200a172b7e) –

+0

Кстати, вы ** передаете копию строки ** на 'remplazarLetras'. Любые внесенные изменения будут сделаны в * copy *. Если вы хотите внести изменения в исходную строку, перейдите по ссылке. –

ответ

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); 
} 
1

В функции iterar аргумента cadena является строкой. Когда вы перебираете эту строку, вы перебираете ее символы. Таким образом, C++ пытается применить reemplazarLetras к каждому символу cadena (и такие символы имеют тип char). К сожалению, ваша функция reemplazarLetras не принимает аргументы типа char: вместо этого он принимает один аргумент string cadena. Это заставляет компилятор C++ жаловаться.

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

 Смежные вопросы

  • Нет связанных вопросов^_^