Ir para conteúdo
Fórum Script Brasil
  • 0

Codificador-Decodificador


good guy

Pergunta

Bom dia Pessoal,

Gostaria de saber se alguém poderia identificar qual o erro no seguinte código:

// Programa p14.c

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

int main(int args, char * arg[])
{
    int i,j,n;
    char optei;
    char texto[100];
    char *str;
    str="texto[i]";
    do
    {
     system("CLS");
     printf("Entre com o texto a ser codificado:\n");
     for (i=0; i<100; i++)
     {
          scanf("%c",&texto[i]);
          if (texto[i] == '.')
          break;
     char *strncpy(char *str1,char *str);
     }
     n = i;
     printf("Texto com %d caracteres.\n", n);
     for (i = 0; i<n; i++)
        texto[i] = (5*texto[i] + 100) % 256;
     printf("Texto codificado:\n");
      for (i=0;i<n;i++)
        printf("%c",texto[i]);
      printf("\n");
      
      printf("Texto decodificado:\n");
          printf("%c",str1);
          printf("\n\n"); 
         
      printf("Continua? (S/N): ");
      optei = toupper(getche());
      }
      while (optei == 'S');
      printf("\n");
      system("PAUSE");
      return 0;
}

Modifiquei a estrutura básica que só codificava e usei a seguinte lógica: acrescentei o ponteiro "*str" que grava a mensagem inicial para depois reapresentá-la no final. Não sei se utilizei a lógica certa. Ao compilar surge um erro na linha "printf("%c",str1);" . Alguém saberia solucionar o problema? Minha lógica estaria errada?

Editado por Micheus
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0
Ao compilar surge um erro na linha "printf("%c",str1);" . Alguém saberia solucionar o problema?
no código que você postou não aparece a declaração de str1, qual seria?

Ah! O ideal é que você poste a mensagem de erro que ocorre (original), assim é mais fácil de alguém auxiliá-lo. ;)

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0
Ao compilar surge um erro na linha "printf("%c",str1);" . Alguém saberia solucionar o problema?
no código que você postou não aparece a declaração de str1, qual seria?

Ah! O ideal é que você poste a mensagem de erro que ocorre (original), assim é mais fácil de alguém auxiliá-lo. ;)

Abraços

Boa tarde Micheus,

Obrigado pela resposta. Realmente eu esqueci de declarar a variável str1. O código compila normalmente, mas não decodifica a mensagem. Dá pra solucionar?

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

int main(int args, char * arg[])
{
  int i,j,n;
  char optei;
  char texto[30];
  char *str, *str1;
  str="texto[i]";
  do
  {
    system("CLS");
    printf("Entre com o texto a ser codificado:\n");
    for (i=0; i<30; i++)
    {
      scanf("%c",&texto[i]);
      char *strncpy(char *str1,char *str);
      if (texto[i] == '.')
        break;
    }
     
    n = i;
    printf("Texto com %d caracteres.\n", n);
    for (i = 0; i<n; i++)
      texto[i] = (5*texto[i] + 100) % 256;
    printf("Texto codificado:\n");
    for (i=0;i<n;i++)
      printf("%c",texto[i]);
    printf("\n");
      
    printf("Texto decodificado:\n");
    printf("%c",str1);
    printf("\n\n"); 
         
    printf("Continua? (S/N): ");
    optei = toupper(getche());
  }
  while (optei == 'S');
    printf("\n");
  system("PAUSE");
  return 0;
}

Editado por Micheus
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link para o comentário
Compartilhar em outros sites

  • 0
Modifiquei a estrutura básica que só codificava e usei a seguinte lógica: acrescentei o ponteiro "*str" que grava a mensagem inicial para depois reapresentá-la no final. Não sei se utilizei a lógica certa.
good guy, qual seria sua intenção ao colocar esta linha no loop inicial de leitura do texto?

char *strncpy(char *str1,char *str);

Primeiramente, você aqui deve ter um erro de compilação (novamente). E por final, este função requer um 3º parâmetro que seria o número máximo de caracteres a copiar.

Bom, de acordo com a idéia que você propôs, os erro estão em:

1) str="texto";

troque por: str=texto; (assim, str receberá o conteúdo de texto)

2) char *strncpy(char *str1,char *str);

conserte e mova para fora do loop: strncpy(str1,str,i); (copia de str para str1 a quantidade de caracteres entrados i)

3) printf("%c",str1);

para imprimir corretamente o texto "decodificado", use assim: printf(str1); (imprime toda a string)

Código "corrigido":

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

int main(int args, char * arg[])
{
  int i,j,n;
  char optei;
  char texto[30];
  char *str, *str1;

  str=texto;
  do
  {
    system("CLS");
    printf("Entre com o texto a ser codificado:\n");
    for (i=0; i<30; i++)
    {
      scanf("%c",&texto[i]);
      if (texto[i] == '.')
    break;
    }
    strncpy(str1,str,i);
    n = i;
    printf("Texto com %d caracteres.\n", n);
    for (i = 0; i<n; i++)
      texto[i] = (5*texto[i] + 100) % 256;
    printf("Texto codificado:\n");
    for (i=0;i<n;i++)
      printf("%c",texto[i]);
    printf("\n");

    printf("Texto decodificado:\n");
    printf(str1);
    printf("\n\n");

    printf("Continua? (S/N): ");
    optei = toupper(getche());
  }
  while (optei == 'S');
  printf("\n");
  system("PAUSE");
  return 0;
}

Quanto a decodificar, na verdade você não decodifica nada - você está ciente disto certo?

Abraços

p.s. Lembre-se de utilizar a tag CODE para deixar o código mais fácil de ler. ;)

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia Micheus,

Obrigado pela ajuda. Mas, o programa corrigido compila e dá erro quando você acaba de digitar um texto, do tipo "Este programa executou uma ação ilegal".

Estou ciente de que o programa codifica, mas não necessariamente decodifica. Como não sei qual seria a formula correta para reverter a codificação, tive a idéia de desenvolver um programa que fizesse uma brincadeira para o usuário e também praticar o pouco que sei da linguagem C.

Você saberia qual a fórmula correta de decodificação ou levar-me a pesquisar na fonte certa?

E quanto ao código corrigido, saberia apontar onde está o problema?

Muito obrigado !!!

Link para o comentário
Compartilhar em outros sites

  • 0
Mas, o programa corrigido compila e dá erro quando você acaba de digitar um texto, do tipo "Este programa executou uma ação ilegal".

(...)

E quanto ao código corrigido, saberia apontar onde está o problema?

é acho que tem um "gato" mesmo. Sem querer mexer no seu código, str1 ficou declarado como um ponteiro e o strncpy vai copiar os bytes entrados em texto, sem que haja memória reservada para isso. :blush:

A menos que você precise utilizar str1 como ponteiro, você poderia delcará-lo do mesmo tipo que texto, e trocamos a função para strcpy:

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

int main(int args, char * arg[])
{
  int i,j,n;
  char optei;
  char texto[30];
  char str[30];
  char *str;

  str=texto;
  do
  {
    system("CLS");
    printf("Entre com o texto a ser codificado:\n");
    for (i=0; i<30; i++)
    {
      scanf("%c",&texto[i]);
      if (texto[i] == '.')
    break;
    }
    strcpy(str1,str);
    n = i;
    printf("Texto com %d caracteres.\n", n);
    for (i = 0; i<n; i++)
      texto[i] = (5*texto[i] + 100) % 256;
    printf("Texto codificado:\n");
    for (i=0;i<n;i++)
      printf("%c",texto[i]);
    printf("\n");

    printf("Texto decodificado:\n");
    printf((char *) str);
    printf("\n\n");

    printf("Continua? (S/N): ");
    optei = toupper(getche());
  }
  while (optei == 'S');
  printf("\n");
  system("PAUSE");
  return 0;
}

veja se ficou ok agora.

Como não sei qual seria a formula correta para reverter a codificação, tive a idéia de desenvolver um programa que fizesse uma brincadeira para o usuário e também praticar o pouco que sei da linguagem C.

Você saberia qual a fórmula correta de decodificação ou levar-me a pesquisar na fonte certa?

Existem codificações são irreversíveis (normalmente as que envolve deslocamento de bits). No seu caso, basta "desfazer" o que foi feito. Para entender, veja o caso da letra 'A' (65 ou &41), aplicando a sua fórmula:

5*65=325

205+100=425

305%256=169

para desfazer, seguimos do final para o início, todo o processo:

169+256=425

425-100=205

325/5=65

voce pode pesquisar por criptografia. Veja este link CIFRAS DE SUBSTITUIÇÃO - Criptologia

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia Micheus,

Meus problemas:

(1)A linha de código corrigido que você enviou aponta para alguns erros. Dentre eles, a não declaração de str1, conflito de tipos para char str... Naquele caso que tipo de declaração é a mais apropriada?str1 é um vetor ou um ponteiro? :huh:

(2)No antigo código, eu inseri a função "fflush(stdin)" para armazenar os bytes da mensagem do vetor str[30] na memória e resolver o problema anterior, mas surgiu outro problema: o programa compila e eu posso digitar o texto, só que o programa não termina dentro da quantidade de caracteres permitida pelo vetor "str". Parece que é permitido digitar interminavelmente o texto.

Mesmo alterando o código da seguinte maneira:

printf("Entre com o texto a ser codificado:\n");

for (i=0; i<30; i++)

{

scanf("%c",&texto);

fflush(stdin);

if ((texto == '.')&&(i==30))

Dá pra ajudar? :rolleyes:

Link para o comentário
Compartilhar em outros sites

  • 0
Bom dia Micheus,

Meus problemas:

(1)A linha de código corrigido que você enviou aponta para alguns erros. Dentre eles, a não declaração de str1, conflito de tipos para char str... Naquele caso que tipo de declaração é a mais apropriada?str1 é um vetor ou um ponteiro? :huh:

(2)No antigo código, eu inseri a função "fflush(stdin)" para armazenar os bytes da mensagem do vetor str[30] na memória e resolver o problema anterior, mas surgiu outro problema: o programa compila e eu posso digitar o texto, só que o programa não termina dentro da quantidade de caracteres permitida pelo vetor "str". Parece que é permitido digitar interminavelmente o texto.

Mesmo alterando o código da seguinte maneira:

printf("Entre com o texto a ser codificado:\n");

for (i=0; i<30; i++)

{

scanf("%c",&texto);

fflush(stdin);

if ((texto == '.')&&(i==30))

Dá pra ajudar? :rolleyes:

Declare o char da opção em outro lugar. =]

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,7k
×
×
  • Criar Novo...