Inversão de vetores de char em C++

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