Не срабатывает gets - C (СИ)
Формулировка задачи:
Добрый день, почему у меня в коде не срабатывает функция gets? Она просто пропускается. Заранее спасибо.
void keyinfile() { char keyname[256]; printf("\nType the name of key file with extension"); gets_s(keyname); //не срабатывает FILE * ptr = fopen(keyname, "wb"); for (int i = 0; key[i] != '\0'; i++) fprintf(ptr, "%c", key[i]); fclose(ptr); }
Решение задачи: «Не срабатывает gets»
textual
Листинг программы
void code() { char ascii[255]; //здесь алфавит 224 char key[520200]; //ключ char ascii2[130050]; //2 буквы char sentence[100000]; char crypted[100000]; for (int j = 0, i = 1; i < 256; i++, j++) { ascii[j] = i; } for (int i = 0, j = 0; i < 255; i++) { for (int d = 0; d < 255; d++, j++) { ascii2[j++] = ascii[i]; } } for (int i = 0, j = 0; i < 255; i++) { for (int d = 0, i = 0; d < 255; d++, j++) { ascii2[++j] = ascii[i++]; } } int j = 0; for (int i = 0; i < 520200; i++) { key[i++] = ascii2[j++]; key[i++] = ascii2[j++]; key[i] = 32; i = i + 3; key[i] = '\n'; if (j == 130050) { j = 0; } } int r1, r2 = 0; char a; char tmp1, tmp2; for (int i = 0; i < 130050;) { r1 = rand() % 130050 + 0; r2 = rand() % 130050 + 0; if (!(r1 & 1) && !(r2 & 1)) { tmp1 = ascii2[r1]; tmp2 = ascii2[++r1]; ascii2[--r1] = ascii2[r2]; ascii2[++r1] = ascii2[++r2]; ascii2[--r2] = tmp1; ascii2[++r2] = tmp2; i++; } } j = 0; for (int i = 3; i < 520200; i = i + 4) { key[i++] = ascii2[j++]; key[i++] = ascii2[j++]; } char keyname[256]; printf("\nType the name of key file with extension"); gets_s(keyname, 256); FILE * ptr = fopen(keyname, "wb"); for (int i = 0; key[i] != '\0'; i++) fprintf(ptr, "%c", key[i]); fclose(ptr); FILE *fp; char *p; int c; int s = 0; const char *filename = "sentence.txt"; fp = fopen(filename, "r"); for (p = sentence; p - sentence < 500 - 1 && (c = getc(fp)) != EOF; p++) { *p = c; s++; } if (c & 0) { sentence[--s] = '\0'; } else *p = '\0'; char x, y; int h = 0; for (int i = 0, j = 0; sentence[i] != '\0'; j = j + 6) { here: if (sentence[i] == key[j]) { x = sentence[i]; i++, j++; if (sentence[i] == key[j]) { y = sentence[i]; j = j + 2; x = key[j++]; y = key[j]; crypted[h++] = x; crypted[h++] = y; j = 0; i++; crypted[h] = '\0'; goto here; } else i--, j--; } } //printf("\nKey : %s", key); FILE * pt = fopen("crypted.txt", "wb"); for (int i = 0; crypted[i] != '\0'; i++) fprintf(pt, "%c", crypted[i]); fclose(pt); }
Объяснение кода листинга программы
В этом коде используется язык программирования C. Здесь представлено краткое описание каждого элемента кода:
- Массивы:
ascii
(строка из 255 символов) используется для хранения ASCII-кодов всех букв алфавита.key
(строка из 520200 символов) используется для хранения ключа, состоящего из двух букв.ascii2
(строка из 130050 символов) используется для хранения расширенного ASCII-кода, состоящего из двух букв.sentence
(строка из 100000 символов) используется для хранения предложения, которое будет зашифровано.crypted
(строка из 100000 символов) используется для хранения зашифрованного предложения.
- Циклы:
- Внешний цикл
for
(переменныеj
иi
) используется для прохода по всем символам в массивеascii
. - Внутренний цикл
for
(переменныеd
иi
) используется для прохода по всем символам в массивеascii2
. - Еще один внутренний цикл
for
(переменныеd
иi
) используется для прохода по всем символам в массивеascii2
. - Цикл
for
(переменныеi
иj
) используется для прохода по всем символам в массивеkey
. - Цикл
for
(переменныеi
иj
) используется для прохода по всем символам в массивеascii2
. - Цикл
for
(переменныеi
иj
) используется для прохода по всем символам в массивеcrypted
.
- Внешний цикл
- Функции:
rand()
используется для генерации случайных чисел.printf()
используется для вывода информации на консоль.gets_s()
используется для считывания строки с консоли.fopen()
,fclose()
,getc()
иfprintf()
используются для работы с файлами.
- Операторы:
++
и--
используются для инкремента и декремента указателей.&
используется для получения адреса символа.==
и!=
используются для сравнения символов.<<
и>>
используются для сдвига указателей.*
используется для разыменования указателей.\\0
используется для обозначения конца строки.
- Переменные:
j
иi
используются в качестве счетчиков в циклах.r1
иr2
используются для хранения случайно сгенерированных чисел.tmp1
иtmp2
используются для временного хранения символов.keyname
используется для хранения имени файла ключа.sentence
используется для хранения предложения, которое будет зашифровано.crypted
используется для хранения зашифрованного предложения.pt
иfp
используются для работы с файлами.
- Условные операторы:
if
иelse
используются для проверки условий и выполнения соответствующих действий.
- Структуры данных:
- В массивах используются динамические строки.
- В циклах используются указатели для работы со строками.
- Комментарии:
- Комментарии в коде обозначены символами
//
и#
. Обратите внимание, что некоторые элементы кода могут быть не полностью описаны в данном списке, но основная структура и назначение каждого элемента должны быть понятны.
- Комментарии в коде обозначены символами
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д