Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Função que retorna vetor

Olá, estou tendo um problema com o seguinte código:

char vet[10];
char encod(char vet[]);

int main(int argc, char *argv[])
{
    while (1)
    {
        printf("entre com o numero:\n");
        scanf("%s", vet);
        printf("seu numero digitado foi: %s\n", vet);
        printf("numero de algarismos sao: %d\n", strlen(vet));
        printf("\nnumero encripitado: %s\n", encod(vet));
        getch();
    }
}
char encod(char vet[])
{
    char matriz[strlen(vet)];
    int n = strlen(vet);
    for (int i = 0; i < n; i++)
    {
        matriz[i] = vet[i];
        matriz[i] = matriz[i] + 1;
        //printf("bloco %i: %c\n", i, matriz[i]);
    }
    //printf("frase: %s\n", matriz);
    return matriz;
}

Estou tentando criar um algoritimo de encriptação de string e esse código seria o prototipo dele. A lógica do código parece estar certa, entretanto o "printf()" que deveria mostrar o numero encriptado está mostrando "null" e eu não faço ideia do por que issso está ocorrendo. Fico feliz se alguém puder me ajudar!

2 respostas
solução!

Sua variável só existe dentro da função "encod".

Um jeito para contornar isso seria declarar a matriz utilizando um ponteiro e alocar espaço para ela com o malloc.

char *matriz = (char*) malloc(strlen(vet) * sizeof(char));

Outra coisa, o retorno da função "encod" deveria ser "char*", pois vc retorna um array de caracteres, e não apenas 1 caracter.

Olá novamente, Alexandre! Obrigado pela ajuda, logo mais estarei testando ela para ver como ficaria, entretanto, desde o dia que eu fiz esse post, eu continuei pensando em outras formas de solucionar o meu problema sozinho enquanto um bom samaritano não aparecia para me dar uma ideia por aqui kkkkk. E depois de muitas pesquisas e tentativas seguidas de fracassos, eu cheguei em um código que conseguisse satisfazer os meus objetivos(ou pelo menos quase):

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

#define cifra 2
char *encod(int *vetor);
char mat[50];
int decod(char *vetor);

int main(int arg, char *argv[])
{
    int vet[3];
    vet[0] = 2147;
    vet[1] = 34569;
    vet[2] = 125590;
    for (int i = 0; i < 3; i++)
    {
        printf("\nnumero encriptado: %s\n", encod(vet[i]));
        printf("numero decodificado: %d\n", decod(encod(vet[i])));
    }
    return 0;
}
char *encod(int *vetor)
{
    itoa(vetor, mat, 10);
    for (int i = 0; i < strlen(mat); i++)
    {
        mat[i] *= cifra;
    }
    return (mat);
}
int decod(char *vetor)
{
    char conv[strlen(vetor)];
    for (int i = 0; i < strlen(vetor); i++)
    {
        conv[i] = vetor[i] / cifra;
        printf("conv%i: %c\n", i, conv[i]);
        printf("n%d: %d\n", i, conv[i]);
    }
    printf("string: %s\n", conv);
    int n = atoi(conv);
    return n;
}

Como você pode ver neste novo código, eu acabei conseguindo contornar alguns dos problemas sozinho, como a questão do retorno da função que era pra retornar um array, mas estava retornando 1 caractere e também a questão do "null" mostrado pelo "printf". Eu com a ingenuidade de um mero mortal, pensei que já tinha resolvido todos os problemas e que já estava pronto pra realmente criar um algorítimo de criptografia e com isso adicionei a função "decod" que desfaz oque a "encod" realiza. Este é um fragmento doque apareceria caso você rodasse o codigo:

numero encriptado: dbhn
conv0: 2
n0: 50

conv1: 1
n1: 49

conv2: 4
n2: 52

conv3: 7
n3: 55

string: 2147Çp@
numero decodificado: 2147

Como as funções são executadas em um loop for, este é o resultado da primeira posição do array de inteiros "vet". "conv" é a exibição do numero já decodificado, mas, ainda em formato de caractere. "n" é o numero que representa o caractere na tabela ASCII. Mas como nem tudo na vida são flores, quando eu mudo o valor da "cifra" de 2 para 3, obviamente os prints na tela também vão mudar, mas a função "decod" não decodifica mais o caractere de volta para o numero verdadeiro. exemplo com "cifra = 3":

numero encriptado: ûô£Ñ
conv0: ¦
n0: -35

conv1: ▄
n1: -36

conv2: ▀
n2: -33

conv3: Ô
n3: -30

string: ¦▄▀ÔÇp@
numero decodificado: 0 

Em "conv" aparecem os respectivos caracteres, mas em "n" aparecem números negativos, sendo que todas as operações realizadas são com números positivos e alem disso, esses numeros não representam os caracteres na tabela ASCII(pegue como exemplo o caractere "Ô" de "conv3"). OBS: se aumentar o valor da cifra para 4, o problema persiste.