Inversão de vetores de char em C++

7 respostas Resolvido
M

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.

7 Respostas

M
#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
P

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.

M
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;
}
P
Solucao aceita

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
M

ok, obrigado vou tentar corrigir

M
#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
M

eu deixei int str[tam - 1 - i] que funcionou kk

Criado 13 de setembro de 2018
Ultima resposta 13 de set. de 2018
Respostas 7
Participantes 2