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

Szyfr Cezara, nie działa poprawnie

0 głosów
423 wizyt
pytanie zadane 19 maja 2018 w C i C++ przez Saddre Nowicjusz (240 p.)

Kod nie działa dla wszystkich konfiguracji liter i liczb tzn. dla klucza=10 wpisuje zzzzz i powinno przeskoczyć na jjjjj, a przeskakuje na znaki z numerem 228. Dla tego samego klucza działają wszystkie litery oprócz 'v' i wzwyż.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
	void szyfr(int klucz, char ciag[], int dlugosc)
	{
		int i = 0;
		for (i = 0; i < dlugosc; i++)
		{
			ciag[i] = ciag[i] + klucz; 
			if (ciag[i] > 122) 
			{ 
			ciag[i] = ciag[i] - 26;
			printf("%c", ciag[i]);
			}
			else printf("%c", ciag[i]);
		}
	}
	int main()
	{
		int i = 0, klucz = 10, dlugosc = 5;
		char ciag[10];
		for (i = 0; i < dlugosc; i++)
		{
			scanf("%c", &ciag[i]);
		}
		szyfr(klucz, ciag, dlugosc);
		_getch();
		return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 19 maja 2018 przez RafalS VIP (122,820 p.)
wybrane 20 maja 2018 przez Saddre
 
Najlepsza

Kod v to 118. Gdy dodasz do niego 10 to daje 128, a pojemność chara może być albo 0 do 255 albo -127 do 127. Sugeruje to, że u Ciebie jest do 127 i przy 128 przeskakuje na -127. Potem wyświetlasz -127 jako char, co daje jakieś dziwne rzeczy.


Wyedytowałem Twój kod tak, żebyś sam zobaczył co się dzieje. Debugowanie printfami zawsze spoko.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <climits>
void szyfr(int klucz, char ciag[], int dlugosc)
{
	int i = 0;
	for (i = 0; i < dlugosc; i++)
	{
		printf("edytuje %c %d\n",ciag[i],ciag[i]);
		ciag[i] = ciag[i] + klucz;
		printf("po dodaniu %c %d\n", ciag[i], ciag[i]);
		if (ciag[i] > 122)
		{
			ciag[i] = ciag[i] - 26;
			printf("przesuniety %c %d\n", ciag[i], ciag[i]);
		}
		else printf("bez przesuniecia %c %d\n", ciag[i], ciag[i]);

		printf("\n\n");
	}
}
int main()
{
	printf("min char: %d; max char: %d\n", CHAR_MIN, CHAR_MAX);
	int i = 0, klucz = 10, dlugosc = 5;
	char ciag[10];
	for (i = 0; i < dlugosc; i++)
	{
		scanf("%c", &ciag[i]);
	}
	szyfr(klucz, ciag, dlugosc);
	_getch();
	return 0;
}

 

1
komentarz 19 maja 2018 przez dt98 Nowicjusz (140 p.)
Proponuję jeszcze na początku funkcji dać linijkę klucz%=26;
komentarz 20 maja 2018 przez Saddre Nowicjusz (240 p.)

@RafalS,  Dziękuję za Twoją odpowiedź, była ona bardzo pomocna.

Podobne pytania

0 głosów
2 odpowiedzi 927 wizyt
pytanie zadane 13 kwietnia 2018 w C i C++ przez Duke_Astaroth Nowicjusz (240 p.)
0 głosów
0 odpowiedzi 519 wizyt
pytanie zadane 11 lipca 2018 w C i C++ przez niezalogowany
0 głosów
1 odpowiedź 1,643 wizyt
pytanie zadane 29 maja 2018 w PHP przez OdsetekGlupoty Pasjonat (15,360 p.)

93,428 zapytań

142,423 odpowiedzi

322,652 komentarzy

62,789 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...