2017-02-20 57 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'。所做的任何更改將發送到*副本*。如果您想對原始字符串進行更改,請按引用傳遞。 –

回答

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; 
} 
相關問題