Program wykorzystujący szyfr cezara - zaszyfrowany tekst jest zakończony dziwnymi znakami

0

Witam, musze napisac projekt zaliczeniowy z jezyka C.
Postanowilem, ze napisze program szyfrujacy i odszyfrujacy jakis tekst.
Mam problem odnosnie szyfrowania , nie wiem czemu ale szyfruje mi nieraz jakies dziwne znaki na koncu tekstu, ktorych w ogolnie nie podalem. Rowniez mam problem ze switch i case w wyborze co chcemy zrobic: szyfrowac lub odszyfrowac, podejrzewam ze lezy tam blad w gets. Ponizej umieszczam kod.

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

#define MAX 1000

char szyfruj(char tab[MAX], char tab2[MAX]){
int i,dl=0,kod,temp;
char zapis;
FILE *plik;
	printf("KODOWANIE\n");
	printf("Podaj Wyraz: ");
	gets(tab);
	printf("Twoj Wyraz: %s\n", tab);

	for(i=0;i<MAX;i++){
		if(tab[i]!='\0')
			dl++;
		else
			break;
	}
	printf("dlugosc twojego wyrazu: %d\n",dl);

	for(i=0;i<dl;i++){
		 kod=(char)tab[i]+3;
		 if(kod>=32 && kod<=126){
		 	tab2[i]=(int)kod;
		 }
		 else if(kod>126){
		 	temp=kod-95;
		 	tab2[i]=(int)temp;
		 }
	}
	printf("Zaszyfrowany Wyraz: %s\n\n",tab2);
	printf("Chcesz zapisac szyfr do pliku? T/N\n");
	scanf("%s",&zapis);
	if(zapis=='T' || zapis=='t'){
		if ((plik=fopen("Zaszyfrowany.txt","w"))==NULL ){
		printf("Nie mozna otworzyc pliku");
		exit(1);
		}	
	fprintf(plik,"%s",tab2);
	printf("Zapisane pomyslnie\n");
	fclose(plik);
	}
	
return tab2[MAX];
}	

char deszyfruj(char tab2[MAX],char tab3[MAX]){
int i,temp,kod,dl=0;
char zapis;
FILE *plik;
	printf("ODKODOWANIE\n");
	for(i=0;i<MAX;i++){
		if(tab2[i]!='\0')
			dl++;
		else
			break;
	}
	printf("dlugosc twojego wyrazu: %d\n",dl);
	for(i=0;i<dl;i++){
		 kod=(char)tab2[i]-3;
		 if(kod>=32 && kod<=126){
		 	tab3[i]=(int)kod;
		 }
		 else if(kod<32){
		 	temp=kod+31;
		 	tab3[i]=(int)temp;
		 }
	}
	printf("Odszyfrowany Wyraz: %s\n",tab3);
	printf("Chcesz zapisac szyfr do pliku? T/N\n");
	scanf("%s",&zapis);
	if(zapis=='T' || zapis=='t'){
		if ((plik=fopen("Odszyfrowany.txt","w"))==NULL ){
		printf("Nie mozna otworzyc pliku");
		exit(1);
		}	
			fprintf(plik,"%s",tab3);
			printf("Zapisane pomyslnie\n");
			fclose(plik);
	}
	
return tab3[MAX];
}

main() {
	char tab[MAX], tab2[MAX], tab3[MAX];
	system("Color 02");
	szyfruj(tab,tab2);
	deszyfruj(tab2,tab3);

	system("PAUSE");
	return 0;
} 
0

A może tak poszukasz na tym forum. Było o tym ponad 100 razy. Jakoś bez sensu w kółko to samo opowiadać.

Poczytaj może podstawy zwłaszcza scanf oraz %s dla niego.
Nie masz żadnego problemu ze switch/case ponieważ zwyczajnie nie masz żadnego switch/case.

0

scanf wczytuje tylko do białego znaku, a ja chce zeby i wczytywalo mi spacje, fgets jak i scanf wczytuje tylko mi do spacji.
Switch i case nie dzialalo mi poprawnie dlatego umiescilem kod bez tego, ale sadze ze jest to wina gets, wiec jezeli bym to poprawil wszystko powinno byc dobrze.
Nie moge dojść dlaczego czasami wczytuje mi dziwne znaki na koncu tekstu.

1

Użyj char T[] i wczytuj to jak człowiek.
http://ideone.com/PIFaJC
Poza tym wywal to wszystko i napisz od nowa. To powinno byc 20 linijek kodu...

0

zmieniłem troche kod, teraz wczytuje z pliku tekst, ale jest nadal to samo
np:
dla tekstu "Szyfr Cezara v20"
szyfruje mi "V}|iu#Fh}dud#y538ů" nie mam pojecia skad sie bierze ta koncowka "8ů"
dla innego tekstu szyfruje juz dobrze, tylko z niektorymi tekstami mam problem.

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

#define MAX 1000

char szyfruj(char tab2[MAX]){
int i,dl=0,kod,temp;
char zapis,tab[MAX];
FILE *plik;
	printf("KODOWANIE\n");
	plik=fopen("tekst.txt","r");
	fgets(tab,sizeof(tab),plik);
	fclose(plik);
	printf("wczytany tekst: %s\n",tab);
	
	for(i=0;i<MAX;i++){
		if(tab[i]!='\0')
			dl++;
		else
			break;
	}
	printf("dlugosc twojego wyrazu: %d\n",dl);

	for(i=0;i<dl;i++){
		 kod=(char)tab[i]+3;
		 if(kod>=32 && kod<=126){
		 	tab2[i]=(int)kod;
		 }
		 else if(kod>126){
		 	temp=kod-95;
		 	tab2[i]=(int)temp;
		 }
	}
	printf("Zaszyfrowany Wyraz: %s\n\n",tab2);
	printf("Chcesz zapisac szyfr do pliku? T/N\n");
	scanf("%c",&zapis);
	if(zapis=='T' || zapis=='t'){
		if ((plik=fopen("Zaszyfrowany.txt","w"))==NULL ){
		printf("Nie mozna otworzyc pliku");
		exit(1);
		}	
	fprintf(plik,"%s",tab2);
	printf("Zapisane pomyslnie\n");
	fclose(plik);
	}
	
return tab2[MAX];
}	

char deszyfruj(char tab3[MAX]){
int i,temp,kod,dl=0;
char zapis, tab2[MAX];
FILE *plik;
	printf("ODKODOWANIE\n");
	plik=fopen("Zaszyfrowany.txt","r");
	fgets(tab2,sizeof(tab2),plik);
	fclose(plik);
	printf("wczytany tekst: %s\n",tab2);
	for(i=0;i<MAX;i++){
		if(tab2[i]!='\0')
			dl++;
		else
			break;
	}
	printf("dlugosc twojego wyrazu: %d\n",dl);
	for(i=0;i<dl;i++){
		 kod=(char)tab2[i]-3;
		 if(kod>=32 && kod<=126){
		 	tab3[i]=(int)kod;
		 }
		 else if(kod<32){
		 	temp=kod+31;
		 	tab3[i]=(int)temp;
		 }
	}
	printf("Odszyfrowany Wyraz: %s\n",tab3);
	printf("Chcesz zapisac szyfr do pliku? T/N\n");
	scanf("%s",&zapis);
	if(zapis=='T' || zapis=='t'){
		if ((plik=fopen("Odszyfrowany.txt","w"))==NULL ){
		printf("Nie mozna otworzyc pliku");
		exit(1);
		}	
			fprintf(plik,"%s",tab3);
			printf("Zapisane pomyslnie\n\n");
			fclose(plik);
	}
	
return tab3[MAX];
}

main() {
	char tab[MAX], tab2[MAX], tab3[MAX];
	int i, dl=0, kod, temp, wybor;
	FILE *plik;
	system("Color 02");
	plik=fopen("tekst.txt","w");
	printf("podaj tekst:");
	fgets(tab,sizeof(tab),stdin);
	fprintf(plik,"%s",tab);
	fclose(plik);
	
	szyfruj(tab2);
	deszyfruj(tab3);

	system("PAUSE");
	return 0;
}

Chce zrobic program, w ktorym bede mogl zaszyfrowac lub odszyfrowac jakis tekst z pliku i nie moge dojsc dlaczego szyfruje mi znaki, ktorych w ogolnie nie podalem

Czyli moj caly kod do niczego sie nie nadaje? Dopiero sie ucze jezyka.

1

Jak się uczysz, to pasowało by choć trochę czegoś poczytać. Czegokolwiek, a nie kopiować bezmyślnie program i wierzyć, że a nuż się teraz uda. Poczytaj o: fgets, fputs, fopen i prawach(kiedy w, a kiedy r). Jeśli chcesz meny na switch, to musisz to wpisać w main() http://pastebin.com/BV6qyu2e. Formatowanie Twojego programu jest tak złe, że nie będę temu bardziej się przyglądał. Poczytaj sobie jakis tutorial/książkę i dopiero podejdz do pisania, polecam http://www.cplusplus.com/reference/cstdio/fopen/

0
Kubacee napisał(a):

nie mam pojecia skad sie bierze ta koncowka "8ů"
To są kody poniżej 32.

0

program nie kopiowalem, tylko pisalem sam. W takim razie przystapie do tego jeszcze raz :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1