Para oferecer maior segurança a seus usuários, a empresa RainData armazena a senha dos usuários da seguinte maneira:
Na senha original, substitui-se algumas consoantes maiúsculas por números, conforme a tabela abaixo
Inverte-se a string obtida no passo anterior
Consoante Número correspondente
C 1
S 2
T 3
R 4
P 5
Faça um programa que tenha como entrada uma string contendo a senha ser criptografada. Como saída, o programa deve imprimir a senha criptografada conforme as condições apresentadas anteriormente.
#include <iostream>
#include <string.h>
using namespace std;
char inverte(char str[]){
int tam;
tam = strlen(str);
int i;
char aux;
for(i = 0; i < tam/2; i++){
aux = str[i];
str[i] = str[tam - 1 - i];
str[tam - 1 - i] = aux;
}
return inverte(str);
}
int main(){
int i;
char stri[100];
cin.getline(stri, 100);
for(i = 0; i < strlen(stri); i++){
if(stri[i] == 'C'){
stri[i] = '1';
}else if(stri[i] == 'S'){
stri[i] = '2';
}else if(stri[i] == 'T'){
stri[i] = '3';
}else if(stri[i] == 'R'){
stri[i] = '4';
}else if(stri[i] == 'P'){
stri[i] = '5';
}
cout << inverte(stri) << endl;
}
}
//Está dando Segmentation fault
Vamos la
Primeiro no main vc so deveria chamar inverte
fora do loop for
Segundo q a função inverte recebe um ponteiro, então todas as alterações no vetor de entrada vão ser percebidas depois da execução.
Sabe como vc leu a entrada? É a mesma coisa.
Vc não deveria retornar nada. Inclusive vc diz q retorna um char (e não o array completo). Pra piorar vc esta chamando essa função de forma recursiva e certamente isso causa do segfault. Tira esse return, transforma em void e monstra o array depois de chamar inverte.
void inverte(char* str){
int tam;
tam = strlen(str);
int i;
char aux;
for(i = 0; i < tam/2; i++){
aux = str[i];
str[i] = str[tam - 1 - i];
str[tam - 1 - i] = aux;
}
}
int main(){
int i;
char stri[100];
cin.getline(stri, 100);
for(i = 0; i < strlen(stri); i++){
if(stri[i] == 'C'){
stri[i] = '1';
}else if(stri[i] == 'S'){
stri[i] = '2';
}else if(stri[i] == 'T'){
stri[i] = '3';
}else if(stri[i] == 'R'){
stri[i] = '4';
}else if(stri[i] == 'P'){
stri[i] = '5';
}
}
cout << inverte(stri) << endl;
}
ao inves de
cout << inverte(stri) << endl;
faça
inverte(stri);
cout << stri << endl;
dicas:
- se na função inverte vc fizer
int max = strlen(str) - 1;
e usar max
no lugar de tam
vc não vai precisar substrair 1 a toda hora e o codigo fica legivel.
- vc pode criar uma funcao criptografar que semelhante a inverte que ja faz a troca do C por 1, etc
- vc pode usar um switch/case no lugar desses if / else if
- tem umas mutretas pra vc trocar C por 1 e S por 2. mas acho q o importante é o programa fucionar
ok, obrigado vou tentar corrigir
#include
#include <string.h>
using namespace std;
void inverte(char* str){
int tam;
tam = strlen(str) - 1;
int i;
char aux;
for(i = 0; i < tam/2; i++){
aux = str[i];
str[i] = str[tam - i];
str[tam - i] = aux;
}
}
int main(){
int i;
char stri[100];
cin.getline(stri, 100);
for(i = 0; i < strlen(stri); i++){
switch(stri[i]){
case ‘C’:
stri[i] = ‘1’;
break;
case ‘S’:
stri[i] = ‘2’;
break;
case ‘T’:
stri[i] = ‘3’;
break;
case ‘R’:
stri[i] = ‘4’;
break;
case ‘P’:
stri[i] = ‘5’;
default:
break;
}
}
inverte(stri);
cout << stri << endl;
}
//Entrada: CoStUReira Saida: arie4Ut2o1, o meu esta saindo: arieU4t2oi
//O U está trocando com o 4
eu deixei int str[tam - 1 - i] que funcionou kk