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:
for
vez de switch
? 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; }