• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Szyfr Cezara - czemu nie działa?

Object Storage Arubacloud
0 głosów
657 wizyt
pytanie zadane 13 kwietnia 2018 w C i C++ przez Duke_Astaroth Nowicjusz (240 p.)

Witam, mam pytanie apropo zadania c. z załączonego zdjęcia, chodzi o szyfrowanie Cezarem, program zwraca tekst jedynie częściowo zaszyfrowany tekst. W czym jest problem? Z góry dziękuję za pomoc.

#include <iostream>
#include <string>
#include <fstream>
#include <algorithm>

using namespace std;

int obliczKlucz(string s)
{
int a = count(s.begin(), s.end(), 'a');
int e = count(s.begin(), s.end(), 'e');
int o = count(s.begin(), s.end(), 'o');

return (a+e+o);
}

string szyfruj (string tekst, int klucz){
	int i=0;
	const int n=tekst.size();
	char sz[n];
	while(i<tekst.size()){
		if(tekst[i]+klucz>126)
			sz[i]=(char)(tekst[i]+klucz-95);
		else
			sz[i]=(char)(tekst[i]+klucz);
	i++;
	}
	return sz;
}

string rozszyfruj (string tekst, int klucz){
	int i=0;
	const int n=tekst.size();
	char sz[n];
	while(i<tekst.size()){
		if(tekst[i]-klucz>126)
			sz[i]=(char)(tekst[i]-klucz+95);
		else
			sz[i]=(char)(tekst[i]-klucz);
	i++;
	}
	return sz;
}

int main(){
	int klucz=0;
	int w=0;
	string tekst;
	string szyfr;
	string roz;
	cout<<"Wybierz operacje: 1-zaszyfrowanie tekstu 2-rozszyfrowanie tekstu"<<endl;
	cin>>w;
	switch(w){
	case 1:{	
		cout<<"Podaj tekst:"<<endl;
		cin>>tekst;
		klucz=obliczKlucz(tekst);
		cout<<"Tekst po zaszyfrowaniu: "<<endl;
		szyfr=szyfruj(tekst, klucz);
		cout<<szyfr<<endl;
		ofstream zapis;
		zapis.open("cezar.txt");
		zapis<<szyfr;
		zapis.close();
		zapis.open("klucz.txt");
		zapis<<klucz;
		zapis.close();
		break;
	}
	case 2:{
		ifstream odczyt;
		/*odczyt.open("cezar.txt");
		odczyt<<szyfr;
		odczyt.close();
		odczyt.open("klucz.txt");
		odczyt<<klucz;
		cout<<"Tekst po rozszyfrowaniu: "<<endl;
		roz=rozszyfruj(szyfr, klucz);
		cout<<roz;
		*/break;
	}
	default:{
		cout<<"Wybrano nieprawidlowa operacje"<<endl;
		break;
	}
	}
	return 0;
}
1
komentarz 14 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)

Taka uwaga:

const int n=tekst.size();
char sz[n];

Taki sposób tworzenia tablic jest niepoprawny w C++. Wyrażenie określające wielkość tablicy musi być możliwe do obliczenia w czasie kompilacji. Ponadto ten ciąg znaków nie jest zakończony nullem, co może sprawić, że program będzie źle działał. Skoro zwracasz stringa, to czemu zmienna sz nie jest stringiem?

komentarz 14 kwietnia 2018 przez Patrycjerz Mędrzec (192,320 p.)
Jeśli autor pytania używa kompilatora obsługującego variable-length arrays (np. GCC), to nie ma chyba powodu, aby nie używał takiej składni, głównie jeśli kod jest czysto dydaktyczny. Oczywiście warto wspomnieć, że ta funkcja nie zawiera się w standardzie języka C++, ale C już tak.

2 odpowiedzi

+1 głos
odpowiedź 13 kwietnia 2018 przez Patrycjerz Mędrzec (192,320 p.)
if(tekst[i]-klucz>126)

W funkcji `rozszyfruj` powinno być w warunku `< 32`.

0 głosów
odpowiedź 14 kwietnia 2018 przez RafalS VIP (122,820 p.)

Dodatkowo wczytywanie przez cin >> tekst wczytuje Ci tylko jedno słowo. Żeby wczytywało całą podaną linijkę możesz skorzystać z takiej konstrukcji:

char input[100];
cin.getline(input,sizeof(input));

Plus operatory >> w złą stronę przy wczytywaniu z pliku w case 2 :P

Podobne pytania

0 głosów
2 odpowiedzi 313 wizyt
pytanie zadane 22 kwietnia 2017 w C i C++ przez SebekChlebek Stary wyjadacz (11,290 p.)
0 głosów
1 odpowiedź 363 wizyt
pytanie zadane 19 maja 2018 w C i C++ przez Saddre Nowicjusz (240 p.)
0 głosów
1 odpowiedź 396 wizyt
pytanie zadane 7 grudnia 2015 w C i C++ przez Armando Obywatel (1,870 p.)

92,576 zapytań

141,426 odpowiedzi

319,650 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...