Szyfr Cezara w C

0

Stworzyłem sobie progra, ktory koduje mi jedno slowo podanym przeze mnie kluczem, ale chciałbym teraz żeby program kodował mi całe zdanie, tj
Input : ABCD ABCD dla klucza=3
Output: DEFG DEFG
więc chce się dowiedzieć, czy jest możliwość wczytywania danych znak po znaku i następnie zapisywania ich do tablicy?

#include <stdio.h>
#include <ctype.h>
#include<stdbool.h>
#include <string.h>
int main (void)
{
    bool ok = true;
    int wybor, klucz;
    char jawny[181];
    while (ok)
    {
        printf ("1.wpisz\n2.szyfruj\n3.koniec\n");
        scanf("%d",&wybor);
        switch (wybor)
        {
        case 1: //
            printf ("Podaj swoje zdanie \n");
            scanf ("%s", jawny);
            printf ("twoj napis to %s\n", jawny);
            break;
        case 2:
            printf ("podaj klucz: ");
            scanf ("%d", &klucz);
            printf ("twoj klucz to: %d\n",klucz);
            for (int i=0; i<strlen(jawny); i++)
            {
                if (isupper(jawny[i]))
                {
                    jawny[i]=jawny[i]+(char)klucz;
                }
                else if (islower(jawny[i]))
                {
                    jawny[i]=jawny[i]+(char)klucz;
                }
                else
                    jawny[i]=jawny[i];
            }
            printf ("%s\n", jawny);
            break;

        case 3:
            ok = false;
            break;
        default :
            ok = false;
            break;
        }
    }
}


2

Możesz użyć funkcji fgets, żeby wczytać wszystkie znaki z stdin do bufora tekstowego oczywiście łącznie ze spacją. Przed użyciem tej funkcji musisz też pamiętać, że przed tym wywołujesz scanf do pobrania liczby - funkcja ta nie pobiera znaku nowej linii i zostawia ją w streamie. Wówczas fgets pobierze znak nowej linii i zakończy działanie, a tego byśmy nie chcieli dlatego musisz wywołać funkcję scanf tak, żeby pobrała ona znak nowej linii, ale nigdzie go nie "wrzucała":

scanf("%d%*c", &wybor);

O działaniu fgets możesz poczytać na przykład tutaj --> https://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm

Dodatkowo: W Twoim programie jest błąd jeśli chodzi o szyfrowanie. Spróbuj wpisać ciąg "ABCD" i klucz np. 989898989898. Podpowiem, że ten klucz musisz zaokrąglić do liczb z przedziału [0,26), które oznaczają indeksy liter alfabetu angielskiego - możesz użyć do tego modulo, czyli instrukcji wyliczającej resztę z dzielenia.

0

Super działa.
Mam jeszcze jednak problem dokladnym zadaniem ktore mam wykonac jest :
"Stworz tablice do przechowywania tekstu max 180 znaków, wczytuj cały teskt z stdin znak po znaku i zapisuj je do tej tablicy, w momencie przeczytania klawisza Esc i zatwierdzeniu go enterem do tablicy wpisz znak konca łańcucha i przerwij wczytywanie, następnie wyświetl tekst w postaci łańcucha znaków"
czy da się to osiągnąc funkcja fgets()? próbowałem sie bawic z getchar(), ale nie potrafiłem dopisywać znakow do innej tablicy.

1

Wczytywanie tekstu znak po znaku jest domeną właśnie funkcji getchar. Zobacz coś takiego:

#include <stdio.h>

#define esc 27

int main() {
	const size_t size = 11;
	char buffer[size];
	int i = 0;

	for (i; i < size - 1; i++) {
		buffer[i] = getchar();
		if (buffer[i] == esc || buffer[i] == '\n') {
			buffer[i] = '\0';
			break;
		}
	}

	if (buffer[i] != esc) { 
		buffer[size - 1] = '\0';
	}
	puts(buffer);
	return 0;
}

Oczywiście można byłoby to oszukać, bo w sumie to za każdym razem jak naciśniemy Enter moglibyśmy wyjść z pętli wczytującej znaki i nie sprawdzać nawet tego czy akurat użytkownik kliknął ESC, ale niech będzie. Jeśli tekst może posiadać znak nowej linii w zawartości to należy użyć EOF. Na przykład:

#include <stdio.h>

#define esc 27

int main() {
	const size_t size = 11;
	char buffer[size];
	int i = 0;

	while ((buffer[i] = getchar()) != EOF && buffer[i] != esc) {
		i++;			
	}

	buffer[i] = '\0';
	puts(buffer);
	return 0;
}
0

moja rada, dziel problemy na małe funkcje. Np

char cezarEcncodeCharacter(char ch, int code);
int cezarNormalizeCode(int code);
void cezarEncodeString(char *dst, char *src, int code);

Będzie ci łatwiej pisać i czytać kod.

0

Dziękuje strasznie, wszystko działa tak jak miało.

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