Ошибки в коде ROT13 (C)

Моя программа должна принимать символ и кодировать его с помощью ROT13, если это буква, а в противном случае оставлять его таким же, а затем печатать результат.

Мой код ниже работает для всех строчных букв и прописных букв AM, но не работает с прописными буквами NZ и другими символами/цифрами. Любая помощь приветствуется :)

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

#define TRUE 1
#define FALSE 0

#define UPPER_START 65
#define UPPER_END 90
#define LOWER_START 97
#define LOWER_END 122

#define UPPER_MID 77
#define LOWER_MID 109


void testEncode (void); int isValid (char cipherChar); char encode (char letter);

int main (int argc, char* argv[]) {

    char cipherChar;

    scanf("%c", &cipherChar);
    if (isValid(cipherChar) == TRUE) {
        printf("%c", encode (cipherChar));
    } else if (isValid(cipherChar) == FALSE) {
       printf("%c", cipherChar);
    }
       return EXIT_SUCCESS;

}

int isValid (char cipherChar) {

    int valid;

    if ((cipherChar >= UPPER_START) &&
        (cipherChar <= UPPER_END)) {
        valid = TRUE;
    } else if ((cipherChar >= LOWER_START) &&
            (cipherChar <= LOWER_END)) {
        valid = TRUE;
    } else {
        valid = FALSE;
    }

    return valid;
}

char encode (char letter) {

    if ((letter <= UPPER_MID) || (letter <= LOWER_MID)) {
        letter = letter + 13;
    } else {
        letter = (letter - 13);
    }

    return letter;
}

person Phoebe    schedule 12.04.2013    source источник
comment
В вашей функции кодирования я бы просто использовал оператор мода (%). Намного проще.   -  person tangrs    schedule 12.04.2013
comment
Если у вас есть доступ к компилятору C99 (их несколько), вы можете включить #include <stdbool.h> и вместо использования int вы можете использовать bool, а вместо TRUE и FALSE вы можете использовать стандартные true и false.   -  person dreamlax    schedule 12.04.2013


Ответы (1)


ROT13 обычно не влияет на символы, кроме [A-Za-z], поэтому я бы посоветовал просто игнорировать их. если у вас нет причин их вращать. Например, иногда 0-9 обрабатываются с помощью ROT5.

В любом случае, ваш оператор if с пунктом (letter <= UPPER_MID) || (letter <= LOWER_MID) в основном говорит: «к любому символу до «a» добавляется 13», поэтому [N-Z] работает неправильно. Вместо этого попробуйте разделить логику верхнего и нижнего регистра и обработать перенос для каждого регистра, например:

if (letter >= UPPER_START && letter <= UPPER_END) {
    letter = letter + 13;

    if (letter > UPPER_END) {
        letter -= 13;
    }
} else if (letter >= LOWER_START && letter <= LOWER_END) {
    letter = (letter + 13);

    if (letter > LOWER_END) {
        letter -= 13;
    }
}
person Fls'Zen    schedule 12.04.2013