Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Isadora Souza

Lendo Strings na presença de structs

Recommended Posts

Olá pessoal,

Estou com um problema muito estranho no meu programa... Ele cumpre o que "promete" exceto pelo fato dele fazer isso até o espaço...

Já tentei usar scanf%s[^\n] %[^\n] %[^\n]s, fgets(frase, 100, stdin)... TUDO... E não funciona direito!

Quando usei scanf%[^\n] e getchar(); ele funcionava mas o programa não fechava, continuava rodando, sendo q tem o return 0 certinho, enfim, loucura.

A única coisa diferente que fiz foi usar structs no programa... Me ajudem, pf!

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct {
	char az_min1[26];
	char *az_min2;
	char az_mai1[26];
	char *az_mai2;
}dic;

char *strrot (int offset, size_t size, const char *inStr);
void criptografar (dic *cesar, const char *frase, int n);
void decriptografar (dic *cesar, const char *frase, int n);
void quebrar (dic *cesar, const char *frase);

int main (int argc, char **argv) {
	int op, n, i;
	char frase[100];
	dic cesar;

	frase[99] = '\0';
	for (i=0; i<26; i++) {
		cesar.az_min1[i] = (97+i); // preenche o vetor com a até z
		cesar.az_mai1[i] = (65+i); // preenche o vetor com A até Z
	}
	cesar.az_min2 = cesar.az_mai2 = NULL;

	printf("Digite 1 para criptografar uma texto\n");
	printf("Digite 2 para descriptografar uma texto\n");
	printf("Digite 3 para quebrar a cifra de Cesar\n");
	scanf("%d", &op);

	if (op == 1) {
		printf("\nVocê escolheu: Criptografar um texto\n");
		printf("Digite a chave N: ");
		scanf("%d", &n);
		printf("Digite o texto: ");
		//fgets(frase, 100, stdin);  // tem q ver se a frase vai só ate 100 de tamanho
		scanf ("%s", frase);
		printf("%s\n", frase);
		criptografar (&cesar, frase, n);
	}
	else if (op == 2) {
		printf("\nVocê escolheu: Decriptografar um texto\n");
		printf("Digite a chave N: ");
		scanf("%d", &n);
		printf("Digite o texto: ");
		//fgets(frase, 100, stdin);  // tem q ver se a frase vai só ate 100 de tamanho
		scanf ("%s", frase);
		printf("%s\n", frase);
		decriptografar (&cesar, frase, n);
	}
	else if (op == 3) {
		printf("\nVocê escolheu: Quebrar criptografia\n");
		printf("Digite o texto: ");
		//fgets(frase, 100, stdin);  // tem q ver se a frase vai só ate 100 de tamanho
		scanf ("%s", frase);
		printf("%s\n", frase);
		quebrar (&cesar, frase);
	}

	if (cesar.az_min2 != NULL)
		free (cesar.az_min2);
	if (cesar.az_mai2 != NULL)
		free (cesar.az_mai2);
	return 0;
}

void criptografar (dic *cesar, const char *frase, int n) {
	int i, j;

	if (cesar->az_min2 != NULL)
		free (cesar->az_min2);
	if (cesar->az_mai2 != NULL)
		free (cesar->az_mai2);
	cesar->az_min2 = strrot ((26-n), 26, cesar->az_min1);
	cesar->az_mai2 = strrot ((26-n), 26, cesar->az_mai1);
	
	for (i = 0; i < strlen(frase); i++) {
		if (frase[i] > 96 && frase[i] < 123) {
			for (j = 0; j < 26; j++) {
				if (frase[i] == cesar->az_min1[j])
					break;
		}
		printf ("%c", cesar->az_min2[j]);
		}
		else if (frase[i] > 64 && frase[i] < 91) {
			for (j = 0; j < 26; j++) {
				if (frase[i] == cesar->az_mai1[j])
					break;
			}
		printf ("%c", cesar->az_mai2[j]);

		}
		else
			printf ("%c", frase[i]); // se for !$!&$@*#*)%//,.,,[][;[[=+_=-
	}
	printf ("\n");
}

void decriptografar (dic *cesar, const char *frase, int n) {
	int i, j;
	
	if (cesar->az_min2 != NULL)
		free (cesar->az_min2);
	if (cesar->az_mai2 != NULL)
		free (cesar->az_mai2);
	cesar->az_min2 = strrot (n, 26, cesar->az_min1);
	cesar->az_mai2 = strrot (n, 26, cesar->az_mai1);
	
	for (i = 0; i < strlen(frase); i++) {
		if (frase[i] > 96 && frase[i] < 123) {
			for (j = 0; j < 26; j++) {
				if (frase[i] == cesar->az_min1[j])
					break;
		}
		printf ("%c", cesar->az_min2[j]);
		}
		else if (frase[i] > 64 && frase[i] < 91) {
			for (j = 0; j < 26; j++) {
				if (frase[i] == cesar->az_mai1[j])
					break;
			}
		printf ("%c", cesar->az_mai2[j]);

		}
		else
			printf ("%c", frase[i]); // se for !$!&$@*#*)%//,.,,[][;[[=+_=-
	}
	printf ("\n");
}

void quebrar (dic *cesar, const char *frase) {
	int i;

	for (i = 25; i > 0; i --) {
		decriptografar (cesar, frase, i);
	}
	printf ("\n");
}

char *strrot (int offset, size_t size, const char *inStr) {
	char *result = (char *)malloc(size * sizeof(char));
	int trueOffset = size - (offset % size);

	int inIndex = trueOffset;
	int outIndex = 0;

	for (inIndex = trueOffset; inIndex < (int)size; inIndex++, outIndex++) {
		result[outIndex] = inStr[inIndex];
	}
	for (inIndex = 0; inIndex < trueOffset; inIndex++, outIndex++) {
		result[outIndex] = inStr[inIndex];
	}

	result[(int)size] = '\0';

	return result;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compilei teu código utilizando o fgets que deixaste comentado, e funcionou perfeitamente.

A não ser os acentos que não aparecem no terminal, está tudo certo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.