String retornando caracter a mais

1. String retornando caracter a mais

Perfil removido
removido

(usa Nenhuma)

Enviado em 02/11/2010 - 16:16h

Pessoal, estou com este problema, o algoritimo retorna 1 caracter a mais após a criptografia, e quando vou fazer o processo inverso, ou seja, a descriptografia, ele aparece 2 caracter a mais no arquivo. Ajudem por favor. o algoritmo é o seguinte:

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

int main()
{
// declarando as variáveis
unsigned long int i=0;
char ch;
char arq1[20],arq2[20];

FILE *fo,*fd; // fo = arquivo origem e fd = arquivo destino

printf("********************************************************\n");
printf("\n");
printf(" C R I P T O G R A F I A \n");
printf("\n");
printf("********************************************************\n");
printf("\nSugestao: coloque o arquivo na mesma pasta do programa\n");
printf("\n o arquivo deve ser digitado com a extensao\n\n\n");

printf("1 - DIGITE O NOME DO ARQUIVO FONTE: ");
gets(arq1); // leitura de string
printf("2 - DIGITE O NOME DO ARQUIVO DE DESTINO: ");
gets(arq2); // leitura de string

fo=fopen(arq1,"r"); // abrindo o arquivo origem como leitura
fd=fopen(arq2,"w"); // abrindo o arquivo destino como gravação

if(fo==NULL) // condição se o arquivo origem não localizado
{
printf("\nARQUIVO FONTE NAO LOCALIZADO OU DIGITADO INCORRETAMENTE!!!\n\n");
system ("pause");
return 1;
}

while(!feof(fo)) // verificando se o arquivo foi lido, retornando verdadeiro
{
ch=getc(fo); // variável "ch" vai receber a leitura da string "fo"
ch=~((ch^i)); // criptografando o conteudo da variável "ch" usando o operador de negociação bit a bit
i+=2; // atribuição de valor a variável "i"

if(i==100000) // condição para variável "i"
{i=0; // variável "i" receberá o valor "zero" caso passo acima seja verdade
}
putc(ch,fd); // escrevendo no arquivo destino o valor da variário "ch"
}
fclose(fo); // fechando o arquivo origem
fclose(fd); // fechando o arquivo destino

printf("\nCRIPTOGRAFIA REALIZADA COM SUCESSO!!!\n");
printf("\nABRA O ARQUIVO DESTINO PARA VER O RESULTADO!!!\n\n");

system ("pause");
return 0;
}

OBS.: O arquivo de origem é um txt com o conteudo "Criptografia", sem linhas, somente a palavra.


  


2. Re: String retornando caracter a mais

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 02/11/2010 - 16:24h

Ola!
Após o primeiro comando dentro do while (ch=getc(fo)), tente printar o char "ch". Acredito que o caractere extra que aparece deve ser o "contrabarra zero" (terminador de cadeia de caracteres em C).
Verifique também se seu arquivo de entrada não possui uma nova linha no final. Isso pode gerar um caractere extra na leitura.


3. Re: String retornando caracter a mais

Perfil removido
removido

(usa Nenhuma)

Enviado em 02/11/2010 - 16:49h

Olá MKlein,

utilizando o printf após o linha subsequente ao while, o resultado é esse:

uma mistura de caracteres, que se eu colar aqui no tópico, fica pior, pois ele "desformata" ainda mais.


4. Re: String retornando caracter a mais

Perfil removido
removido

(usa Nenhuma)

Enviado em 02/11/2010 - 17:08h

Quando pego o conteudo do arquivo e recebo na string, preciso remover um espaço que tem no final da string, ele ta pegando um espaço no final, um caracter espaço. Como fazer isso?


5. Re: String retornando caracter a mais

Mauricio Souza Klein
Hebang

(usa Arch Linux)

Enviado em 02/11/2010 - 18:25h

Fala Everton!
Pra remover o espaço no final, utilize o método strncpy, da string.h

ficaria assim:
char* linha_com_espaco;
char* nova_linha;
strncpy( nova_linha, linha_com_espaco, strlen( linha_com_espaco ) - 1 );

Quanto aos caracteres estranhos no print que deu, tente dar esse print (antes de criptografar, eh claro):
printf( "%c\n", ch );


6. Re: String retornando caracter a mais

Perfil removido
removido

(usa Nenhuma)

Enviado em 03/11/2010 - 22:32h

Fiz como falou, mas não resolveu.

// char linha_com_espaco; neste caso é minha variável " ch "
// char nova_linha; neste caso é minha variável " chN "
strncpy( chN, ch, strlen( ch ) - 1 );

Da esses erros na hora de compilar

invalid conversion from `char' to `const char*'
initializing argument 1 of `size_t strlen(const char*)'
invalid conversion from `char' to `char*'
initializing argument 1 of `char* strncpy(char*, const char*, size_t)'
invalid conversion from `char' to `const char*'
initializing argument 2 of `char* strncpy(char*, const char*, size_t)'
expected `}' at end of input


7. Uma questão de ponteiros

Ezequias Rocha
Ezequias Rocha

(usa Ubuntu)

Enviado em 04/11/2010 - 10:16h

Ola,

O compilador está reclamando que o strncpy espera receber ponteiros e está recebendo objetos. Altere as declarações para

char *ch;
char *chN;
E chame a função:
strncpy( (const char*) chN, (const char*) ch, strlen( ch ) - 1 );

E veja o que acontece.


Embraces!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts