Ir ao conteúdo
  • Cadastre-se

C Manipulação de Strings em C


ReginaldoPaz

Posts recomendados

Olá pessoal, eis-me aqui novamente. rsrsrs 

Precisando de uma ajuda nessa questão. (Obs. Meus professores têm uma criatividade singular)

 

 

A República caiu. O perverso Império Galáctico, que tomou seu lugar, controla tudo e todos com mãos de ferro. Os poucos Jedis que sobreviveram à Ordem 66 estão dispersos pelo universo e a única esperança da galáxia é a resistência formada pela Aliança Rebelde.

Como o Império monitora todas as transmissões, a única chance da Resistência é criptografar os dados antes do envio. Cabe a você, como o último sobrevivente de uma nobre ordem de desenvolvedores, implementar o algoritmo de criptografia que será utilizado nas transmissões de dados da Aliança Rebelde. Que a Força esteja com você!

****

Implemente o algoritmo criptográfico da Aliança Rebelde. O programa deverá receber como entrada uma chave K de 4 dígitos decimais (0000 a 9999) e uma mensagem P de até 200 caracteres. Você deverá criar uma função que receberá P e K, transformando P na mensagem cifrada C a partir da aplicação da chave K. Como saída, o programa deverá imprimir a mensagem cifrada C.

Caso seja informada uma chave fora do padrão, uma mensagem "Chave invalida!" deverá ser exibida.

Os caracteres permitidos para as mensagens, tanto cifrada como original, são definidos no vetor a seguir, que deverá ser incorporado ao seu código:

const char S[]= {'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J', 'K','L','M','N','O','P','Q','R','S','T', 'U','V','W','X','Y','Z','.',',','?',' '};

Caso seja informado algum caractere diferente dos apresentados, o programa deverá exibir a mensagem: "Caractere invalido na entrada!".

O funcionamento do algoritmo é baseado no deslocamento de cada caractere de entrada pelo número de vezes especificado pela chave naquela posição.

 

Exemplos:

Chave(K) : 0123

Mensagem(P): AAAABBBBCC

Cifragem: AAAABBBBCC + 0123012301 = ABCDBCDECD   

 

Chave(K) : 6666

Mensagem(P): WXYZ1234

Cifragem: WXYZ1234 + 66666666 = ? 01789A

Observe que está sendo usado o vetor S para o cálculo de substituição. 

Obs.: Este algoritmo é conhecido como Cifra de Vigenère. Por mais de 300 anos foi chamado de "le chiffre indéchiffrable" (a cifra indecifrável).

 

Meu código:

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

const char S[]=
    {'0','1','2','3','4','5','6','7','8','9',
     'A','B','C','D','E','F','G','H','I','J',
     'K','L','M','N','O','P','Q','R','S','T',
     'U','V','W','X','Y','Z','.',',','?',' '};

int validacao(char *P){ //Principal problema está nessa função
    for(int i = 0; P[i] != '\0'; i++){
        for(int j = 0; j < 40; j++){
            if(P[i] != S[j]){
            }}}


void cifragem(int chave[], char *P){
    int p = 0;

    for(int i = 0; i < strlen(P); i++){
        for(int j = 0; j < 40; j++){
            if(P[i] == S[j]){
                j = j + chave[p];
                if(j > 40){
                    P[i] = S[j%40];
                }else{
                    P[i] = S[j];
                }
                p++;
                if(p == 4){
                    p = 0;
                }
            }
        }
    }
    printf("%s", P);
}

int main(){
     char K[7], P[200];
     int chave[4], tamanho = 0, cont = 0, invalido;

    fgets(K, 7, stdin);
    fgets(P, 200, stdin);
    tamanho = strlen(K) - 1;

    invalido = validacao(P);

    if(tamanho > 4){
        printf("Chave invalida!");
    }else if(invalido == 1){//Problema para validar isso
        printf("Caractere invalido na entrada!");
    }else{
        for(int i = 0; i < tamanho; ++i){
            chave[i] = K[i] - '0';
        }
        cifragem(chave, P);
    }
}

 

Desde já, agradeço a ajuda.

Link para o comentário
Compartilhar em outros sites

@Lucca Rodrigues Então, eu pensei em criar uma função que verifica se o que foi digitado está dentro do char S[ ], no caso, pra saber se os caracteres digitados são válidos ou não e retornar esse valor. Porém, me atrapalhei na construção da semântica nessa função "validacao" em específico.

Link para o comentário
Compartilhar em outros sites

Em 26/02/2021 às 15:14, ReginaldoPaz disse:

Olá pessoal, eis-me aqui novamente. rsrsrs 

Precisando de uma ajuda nessa questão. (Obs. Meus professores têm uma criatividade singular)

 

 

A República caiu. O perverso Império Galáctico, que tomou seu lugar, controla tudo e todos com mãos de ferro. Os poucos Jedis que sobreviveram à Ordem 66 estão dispersos pelo universo e a única esperança da galáxia é a resistência formada pela Aliança Rebelde.

Como o Império monitora todas as transmissões, a única chance da Resistência é criptografar os dados antes do envio. Cabe a você, como o último sobrevivente de uma nobre ordem de desenvolvedores, implementar o algoritmo de criptografia que será utilizado nas transmissões de dados da Aliança Rebelde. Que a Força esteja com você!

****

Implemente o algoritmo criptográfico da Aliança Rebelde. O programa deverá receber como entrada uma chave K de 4 dígitos decimais (0000 a 9999) e uma mensagem P de até 200 caracteres. Você deverá criar uma função que receberá P e K, transformando P na mensagem cifrada C a partir da aplicação da chave K. Como saída, o programa deverá imprimir a mensagem cifrada C.

Caso seja informada uma chave fora do padrão, uma mensagem "Chave invalida!" deverá ser exibida.

Os caracteres permitidos para as mensagens, tanto cifrada como original, são definidos no vetor a seguir, que deverá ser incorporado ao seu código:

const char S[]= {'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J', 'K','L','M','N','O','P','Q','R','S','T', 'U','V','W','X','Y','Z','.',',','?',' '};

Caso seja informado algum caractere diferente dos apresentados, o programa deverá exibir a mensagem: "Caractere invalido na entrada!".

O funcionamento do algoritmo é baseado no deslocamento de cada caractere de entrada pelo número de vezes especificado pela chave naquela posição.

 

Exemplos:

Chave(K) : 0123

Mensagem(P): AAAABBBBCC

Cifragem: AAAABBBBCC + 0123012301 = ABCDBCDECD   

 

Chave(K) : 6666

Mensagem(P): WXYZ1234

Cifragem: WXYZ1234 + 66666666 = ? 01789A

Observe que está sendo usado o vetor S para o cálculo de substituição. 

Obs.: Este algoritmo é conhecido como Cifra de Vigenère. Por mais de 300 anos foi chamado de "le chiffre indéchiffrable" (a cifra indecifrável).

 

Meu código:


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

const char S[]=
    {'0','1','2','3','4','5','6','7','8','9',
     'A','B','C','D','E','F','G','H','I','J',
     'K','L','M','N','O','P','Q','R','S','T',
     'U','V','W','X','Y','Z','.',',','?',' '};

int validacao(char *P){ //Principal problema está nessa função
    for(int i = 0; P[i] != '\0'; i++){
        for(int j = 0; j < 40; j++){
            if(P[i] != S[j]){
            }}}


void cifragem(int chave[], char *P){
    int p = 0;

    for(int i = 0; i < strlen(P); i++){
        for(int j = 0; j < 40; j++){
            if(P[i] == S[j]){
                j = j + chave[p];
                if(j > 40){
                    P[i] = S[j%40];
                }else{
                    P[i] = S[j];
                }
                p++;
                if(p == 4){
                    p = 0;
                }
            }
        }
    }
    printf("%s", P);
}

int main(){
     char K[7], P[200];
     int chave[4], tamanho = 0, cont = 0, invalido;

    fgets(K, 7, stdin);
    fgets(P, 200, stdin);
    tamanho = strlen(K) - 1;

    invalido = validacao(P);

    if(tamanho > 4){
        printf("Chave invalida!");
    }else if(invalido == 1){//Problema para validar isso
        printf("Caractere invalido na entrada!");
    }else{
        for(int i = 0; i < tamanho; ++i){
            chave[i] = K[i] - '0';
        }
        cifragem(chave, P);
    }
}

 

Desde já, agradeço a ajuda.

Consegui resolver!

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Sempre escreva seu programa em torno dos dados. E não escreva uma única linha sem razão.

 

Você pode ver o processo como um filtro, x=f(x) onde cada letra é traduzida pela chave. Mas pode ver a entrada e a chave como um fluxo contínuo de letras e tratar apenas a letra da vez, gerando um novo fluxo que será claro a mensagem criptografada. Fluxo é a nomenclatura para stream. Pode ver isso como uma letra apenas dde cada lado

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!