2017-02-20 28 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

パラメータが単一の文字列であり、 'reemplazarLetras'が単一の文字列を必要とするので、' iterar'がループを必要とする理由は明確ではありません。 –

+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++は、cadenaの各文字にreemplazarLetrasを適用しようとします(このような文字は、タイプcharです)。残念ながら、reemplazarLetras関数はcharタイプの引数を受け入れません:代わりに1つの引数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; 
} 
関連する問題