C ++ Alterando letras minúsculas em uma function de string (novamente …)

Sou eu novamente. De todas as minhas perguntas, acho que esse é o mais idiota de todos, mas, seja por fadiga ou estupidez, também preciso de ajuda. A coisa mais importante, no entanto, é que eu estou fazendo isso para uma tarefa minha e há uma regra estrita – eu devo usar uma function chamada

char* encode(char* source, char const* alpha)

Aqui está o meu código muito primitivo:

  int len = strlen(source); for (int i = 0; i < len; i++) { switch (source[i]) { case 'a': source[i] = alpha[0]; case 'b': source[i] = alpha[1]; case 'c': source[i] = alpha[2]; ................................ ................................ ................................ case 'y': source[i] = alpha[24]; case 'z': source[i] = alpha[25]; default: source[i] = source[i]; } } cout << source << endl; 

Basicamente, deve-se fazer com que uma source de strings inserida de no máximo 1000 símbolos altere todos os seus símbolos minúsculos (‘a’ – ‘z’) para o símbolo correspondente da matriz já inserida (26 símbolos no total para cada minúscula carta … ‘a’ muda com um [0], ‘b’ com b [1], etc.).

Existem vários problemas que tenho aqui:

  1. Meu código não funciona .. A saída é sempre alguns símbolos estranhos. Como posso consertar isso?
  2. Como posso encurtar isso? Talvez use uma instrução for vez de switch ?
  3. Quando está funcionando, como posso implementá-lo para a function que mencionei no início da minha pergunta (esta é provavelmente a mais importante)?

Apenas para o registro, aqui está o meu código de input também:

 char source[1001]; cin.getline(source, 1001, '/n'); char alpha[27]; cin.getline(alpha, 27); 

EDIT: eu mudei meu código para:

 #include  #include  using namespace std; int main() { char source[1001]; cin.getline(source, 1001, '/n'); char alpha[27]; cin.getline(alpha, 27); const int len = strlen(source); for (int i = 0; i < len; i++) { if ('a' <= source[i] && source[i] <= 'z') { source[i] = alpha[source[i] - 'a']; } } cout << source << endl; return 0; } 

No entanto, tornou-se buggier. Agora minha input no console nunca acaba … literalmente .. clicar em Enter não o impede .. nada faz .. Quando eu mudei meu cin.getline para source para 10 ele de alguma forma acabou retornando aqueles símbolos estranhos novamente – ╠╠╠╠ .

Use cstring vez de string :

 #include  

E substitua o switch por if (source[i] >= 'a' && source[i] <= 'z') ...

E este é o seu código final: https://eval.in/95037

 #include  #include  using namespace std; void encode(char *source, const char *alpha) { int i, j; int len = strlen(source); for (i = 0; i < len; i++) { if (source[i] >= 'a' && source[i] <= 'z') { j = source[i] - 'a'; source[i] = alpha[j]; } } } int main(void) { char source[1001]; char alpha[27]; cin.getline(source, 1000); cin.getline(alpha, 27); encode(source, alpha); cout << source << endl; return 0; } 

Em uma instrução switch, quando um caso é correspondido, o código executa todos os casos a seguir, a menos que você use uma break no final de cada caso. Seu código está sempre caindo e atingindo o caso padrão.

Sua instrução switch executa todas as etapas porque você nunca break ou return .

Melhor:

 for (int i = 0; i < len; i++) { if('a' <= source[i] && source[i] <= 'z') { source[i] = alpha[source[i] - 'a']; } } 

Explicação:

source[i] - 'a' é 0 para 'a' , 1 para 'b' , etc. Ele generaliza o padrão que você tinha.

Se você tem permissão, você pode simplesmente ignorar o alpha da string c-style e usar o toupper da function cctype (c).

 #include  for (size_t i = 0; i < strlen(source); i++) { source[i] = toupper(source[i]); } 

em c ++:

 #include  #include  wstring toLower(const wstring& str) { wstring temp = str; std::transform(temp.begin(), temp.end(), temp.begin(), ::towlower); return temp; } //--------------------------------------------------------------------------------------------------------------------- string toLower(const string& str) { string temp = str; std::transform(temp.begin(), temp.end(), temp.begin(), ::tolower); return temp; }