Заменить в строке некоторые символы на их кодовое обозначение - C (СИ)
Формулировка задачи:
Если исходная строка не содержит цифр (те символов с кодами 48-57 по ASCII), то она является не зашифрованной. Необходимо заменить все символы с кодами 33-99 на их двузначные кода. Символы с другими кодами выводятся без изменений.
Пример:
Введите строку:
Hello!
Вывод.
Строка не зашифрована. Шифр: 72ello33.
И наоборот, если содержит, то она является зашифрованной.
Пример:
Введите строку:
72ello33
Вывод.
Строка зашифрована. Шифр: Hello!
При невозможности дешифрации напечатать сообщение об ошибки. И указать где она.
Я написала очень мало, работает, если строка не зашифрована, и то он просто определяет и переводит все, а мне диапазон нужно задать, задаю и не получается.
Помогите пожалуйста, так понимаю, в чем заключается задача и пыталась, делала несколько недель, но ничего...
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
void main()
{
SetConsoleCP(1251); SetConsoleOutputCP(1251);
char *st1 = "'1','2','3','4','5','6','7','8','9','0'";
char str[30];
int i,l;
printf ("Первая строка: %s",st1);
printf("\n Введите строку: ");
scanf("%s",&str);
char *fi=strpbrk(str,st1);
if (fi!=NULL)
{
printf("Cтрока зашифрована. Шифр:");
l=strlen(str);
for(i=0;i<=l;i++)
{
if ((str[i])<=33 && (str[i])>=99)
str[i]=str[i]-32;
printf("%c",str[i]);
}
return 0;
}
else
printf ("Строка не зашифрована. Шифр:");
l=strlen(str);
for(i=0;i<=l;i++)
{
if ((str[i])<=33 && (str[i])>=99)
str[i]=str[i]-32;
printf("%d ",str[i]);
}
getch();
return 0;
}Решение задачи: «Заменить в строке некоторые символы на их кодовое обозначение»
textual
Листинг программы
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
int main() {
SetConsoleCP(1251); SetConsoleOutputCP(1251);
char str[30],str2[60];
printf("\n Введите строку: ");
scanf("%s",&str);
int i;
int contains=0;
for (i=0; i<strlen(str); i++) {
if (str[i]>='0' && str[i]<='9') {
contains=1;
break;
}
}
printf ("\n Строка ");
printf ("%s",(contains?"":"не"));
printf (" зашифрована ");
str2[0]='\0';
char buf[3];
int len = strlen(str);
if (contains) {
i=0;
while (i<len) {
int code=0;
if (str[i]>='0' && str[i]<='9') {
if (i<len-1) {
if (str[i+1]>='0' && str[i+1]<='9') {
strncpy (buf,&str[i],2); buf[2]='\0';
sscanf (buf,"%d",&code);
if (code>=33 && code<=99) sprintf (buf,"%c",code);
}
}
}
if (!code) {
buf[0]=str[i]; buf[1]='\0';
}
else i++;
strcat (str2,buf);
i++;
}
printf ("\n Исходная строка: %s",str2);
}
else {
for (i=0; i<len; i++) {
if (str[i]>=33 && str[i]<=99) sprintf (buf,"%2d",str[i]);
else { buf[0]=str[i]; buf[1]='\0'; }
strcat(str2,buf);
}
printf ("\n Шифр: %s",str2);
}
fflush (stdin); getch(); return 0;
}
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с консолью, строками и числами.
- Установка кодировки консоли в UTF-8.
- Объявление двух буферов для хранения строк (str и str2) и сообщение пользователю о вводе строки.
- Считывание строки с помощью функции scanf.
- Объявление переменной contains для отслеживания наличия цифр в строке.
- Проверка каждого символа строки на наличие в диапазоне от '0' до '9'.
- Если в строке найдены цифры, то переменная contains устанавливается в 1 и цикл прерывается.
- Вывод сообщения о том, зашифрована ли строка.
- Обнуление первого символа в str2.
- Создание буфера buf для хранения числового кода символа.
- Если в строке найдены цифры, то начинается цикл, который считывает два символа, преобразует их в числовой код и добавляет этот код или сам символ в str2.
- Если в строке нет цифр, то цикл пропускается и в str2 добавляется сам символ.
- Если содержит равно 0, то выводится исходная строка.
- Если содержит не равно 0, то выводится шифр.
- Очистка буфера ввода с помощью fflush.
- Получение нажатия клавиши с помощью функции getch.
- Возврат 0, что означает успешное завершение программы.