Ошибки в коде 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;
}
1 ответ
ROT13 обычно не влияет на символы, кроме [A-Za-z]
так что я бы сказал, просто игнорировать их. если у вас нет причин их вращать. Например, иногда 0-9 обрабатывают ROT5.
В любом случае ваш if
заявление с оговоркой (letter <= UPPER_MID) || (letter <= LOWER_MID)
в основном говорится, что "любой символ до" а "получает 13 добавленных к нему", поэтому именно поэтому [NZ] работает неправильно. Вместо этого попробуйте вычеркнуть логику верхнего и нижнего регистра и обработать переход на другой случай, например, так:
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;
}
}