Не срабатывает 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используются для проверки условий и выполнения соответствующих действий.
- Структуры данных:
- В массивах используются динамические строки.
- В циклах используются указатели для работы со строками.
- Комментарии:
- Комментарии в коде обозначены символами
//и#. Обратите внимание, что некоторые элементы кода могут быть не полностью описаны в данном списке, но основная структура и назначение каждого элемента должны быть понятны.
- Комментарии в коде обозначены символами