#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
void encryptmessage1(char[][6]);
void encryptmessage2(char[][6]);
int
main()
{
char array[5][6] = {
{'A', 'B', 'C', 'D', 'E'},
{'F', 'G', 'H', 'I', 'J'},
{'K', 'L', 'M', 'N', 'O'},
{'P', 'Q', 'Z', 'R', 'S', 'T'},
{'U', 'V', 'W', 'X', 'Y'}
};
int choice;
printf("********************************\n");
printf("**ENCRYPTION/DECRYPTION SYSTEM**\n");
printf("********************************\n");
printf("\n");
printf("1.Code the message\n");
printf("2.Decode the message\n");
printf("3.EXIT\n");
printf("Make your choice: ");
scanf("%d", &choice);
switch (choice) {
case 1:
encryptmessage1(array);
encryptmessage2(array);
break;
case 2:
// decrypt message
break;
default:
break;
}
return 0;
}
void
encryptmessage1(char array[][6])
{
int i, j, loop, k = 0, row, col, len = 0;
char str[80] = {};
char temparr[80] = {}; // temporary array
char temp;
printf("Please enter your message : ");
temp = getchar();
// reads string
while ((str[k] = getchar()) != '\n') {
k++;
}
i = 0;
// loop to temporary store values from another array
for (loop = 0; loop < 80; loop++) {
temparr[loop] = str[loop];
}
// Calculating length of the array
len = sizeof(str) / sizeof(str[0]);
// Checks for space character in array if its there then ignores it
// and swap str[i] to str[i+1];
for (i = 0; i < len; i++) {
if (str[i] == ' ') {
for (j = i; j < len; j++) {
str[j] = str[j + 1];
}
len--;
}
}
i = 0;
// from lowercase to uppercase
while (str[i] != '\n') {
if (islower(str[i])) {
str[i] = toupper(str[i]);
}
i++;
}
puts(str);
i = 0;
k = 0;
while (str[k] != '\n') {
for (row = 0; row < 5; row++) {
for (col = 0; col < 6; col++) {
if (str[k] == array[row][col]) {
temparr[i] = '0' + row;
temparr[i + 1] = '0' + col;
i += 2;
}
}
}
k++;
}
puts(temparr);
}
void
encryptmessage2(char array[][6])
{ int i, j, loop, k =0, row, col;
char key[80] = {};
char temparr2[80] = {}; // temporary array
char temp;
printf("Please enter your key : ");
temp = getchar();
// reads string
while ((key[k] = getchar()) != '\n') {
k++;
}
i = 0;
// loop to temporary store values from another array
for (loop = 0; loop < 80; loop++) {
temparr2[loop] = key[loop];
}
// array from lowercase to uppercase
while (key[i] != '\n') {
if (islower(key[i])) {
key[i] = toupper(key[i]);
}
i++;
}
//Printing the array with spaces using pointer
char *ptr = key;
if (*ptr) {
putchar(*ptr++);
while (*ptr) {
putchar(' ');
putchar(*ptr++);
}
}
}
[outputoftheproblem](https://i.stack.imgur.com/wLUGa.png)
Если я ввожу ключевое слово cortina, он просто печатает ortina без первой буквы Я не знаю, проблема в указателе Также любые идеи, как я могу распечатать тот же набор чисел, которые были зашифрованы из str [] в виде массива под словом «CORTINA», как в примере выше:
C O R T I N A
1 1 0 0 3 4 0
3 4 5 6 3 2 5
2 3 4 5 6 7 8
2 3 4 3 2 4 5
это единственный способ, которым я могу прочитать массив по какой-то причине, если я попытаюсь ввести str[]=getchar(), он не будет работать или без getchar он не позволит пользователю ввести сообщение
Вы пытаетесь пропустить новую строку, оставшуюся во входном потоке после scanf()
?
проблема в том, что вы вызываете encryptmessage1()
после scanf()
, поэтому вам нужно пропустить новую строку. Но encryptmessage2()
вызывается после encryptmessage1()
, что не покидает символ новой строки.
Я предлагаю вам изменить весь ваш код, чтобы использовать fgets()
для чтения строки ввода везде. Затем вы можете использовать sscanf()
, чтобы извлечь параметр в основном коде и перебрать его в коде шифрования. Такое смешивание scanf()
и getchar()
чревато ошибками.
@Barmar Я удалил getchar() из кода и заменил его на fgets(), он позволяет мне вводить символы, но проблема с печатью ключевого слова без его первого символа все еще существует.
Вам нужно добавить пробел после %d в main(), чтобы он очищал новую строку от вашего выбора меню. Или используйте fgets там тоже.
Вы также должны использовать fgets()
в main()
. В противном случае fgets()
будет читать пустую строку после числа. См. stackoverflow.com/questions/5918079/…
str[j] = str[j + 1]
выходит за рамки.
char temparr[80] = {}
не является стандартным c, либо используйте { 0 }
, либо просто оставьте его неинициализированным.
@Barmar не использует fgets() для строки или текстовой строки, как я смогу изменить scanf в main(), когда «опция» является целым числом
Да. Вы меняете вот так char choice[3];
а потом if (*choice == '1')
Вы используете fgets(stdin, buffer, sizeof buffer)
, чтобы прочитать строку, затем sscanf(buffer, "%d", &choice)
, чтобы получить выбор. Или choice = atoi(buffer);
Я исправил отсутствующий первый символ и доступ за пределы границ. Рефакторинг кода уменьшает дублирование и минимизирует область действия переменных.
Ключ печатается в соответствии с запросом, но неясно, как вы хотите выровнять ключ и зашифрованный текст. Вы печатаете ciphertext
до того, как будет прочитано key
, и вы не используете key
ни для чего в своем коде. Я предполагаю, что вы хотите перепутать array
с помощью key
.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define STR_LEN 80
void encode(const char array[][6], const char *plaintext, char *ciphertext);
void encrypt(const char array[][6]);
int lookup(const char array[][6], char c, size_t *row, size_t *col);
void strip(char *str);
void upcase(char *str);
void encode(const char array[][6], const char *plaintext, char *ciphertext) {
size_t i = 0;
for(; plaintext[i]; i++) {
size_t row;
size_t col;
if (lookup(array, plaintext[i], &row, &col)) {
ciphertext[2 * i] = '0' + row;
ciphertext[2 * i + 1] = '0' + col;
} else {
ciphertext[2 * i] = ' ';
ciphertext[2 * i + 1] = ' ';
}
}
ciphertext[2*i] = '\0';
puts(ciphertext);
}
void encrypt(const char array[][6]) {
printf("Please enter your message : ");
char plaintext[STR_LEN];
fgets(plaintext, sizeof plaintext, stdin);
plaintext[strcspn(plaintext, "\n")] = '\0';
strip(plaintext);
upcase(plaintext);
puts(plaintext);
char ciphertext[2 * STR_LEN - 1];
encode(array, plaintext, ciphertext);
printf("Please enter your key : ");
char key[STR_LEN];
fgets(key, sizeof key, stdin);
key[strcspn(key, "\n")] = '\0';
upcase(key);
for(size_t i = 0; key[i]; i++) {
putchar(key[i]);
putchar(' ');
}
putchar('\n');
}
int lookup(const char array[][6], char c, size_t *row, size_t *col) {
for(*row = 0; *row < 5; (*row)++)
for(*col = 0; *col < 6; (*col)++)
if (c == array[*row][*col])
return 1;
return 0;
}
void strip(char *str) {
size_t i = 0;
for(size_t j = 0; str[j];) {
if (str[j] == ' ')
j++;
else
str[i++] = str[j++];
}
str[i] = '\0';
}
void upcase(char *str) {
while(*str) {
*str = toupper(*str);
str++;
}
}
int main(void ) {
printf(
"********************************\n"
"**ENCRYPTION/DECRYPTION SYSTEM**\n"
"********************************\n"
"1. Code the message\n"
"2. Decode the message\n"
"3. EXIT\n"
"Make your choice: "
);
char choice[3];
fgets(choice, 3, stdin);
if (*choice == '1') {
const char array[5][6] = {
{'A', 'B', 'C', 'D', 'E'},
{'F', 'G', 'H', 'I', 'J'},
{'K', 'L', 'M', 'N', 'O'},
{'P', 'Q', 'Z', 'R', 'S', 'T'},
{'U', 'V', 'W', 'X', 'Y'}
};
encrypt(array);
}
}
Вот пример запуска:
********************************
**ENCRYPTION/DECRYPTION SYSTEM**
********************************
1. Code the message
2. Decode the message
3. EXIT
Make your choice: 1
Please enter your message : test
TEST
35043435
Please enter your key : cortina
C O R T I N A
Первый символ помещается в
temp
сtemp = getchar();
. Вы никогда не используете это, для чего это?