При декодировании сообщения из аскии кода, первый символ выводится корректно, а остальные нет

Рейтинг: 0Ответов: 2Опубликовано: 19.03.2023

введите сюда описание изображенияЗадание: закодировать и раскодировать текст через аскии со сдвигом. Кодировка происходит верно,но вот декодирование работает только с первым символом, в чем моя ошибка?

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int coder(char* code,int x,int code_base) {
  int *num = new int[x+1];
  for (int i = 0; i < x; i++) {
    num[i] = (int)code[i] + code_base;
  }
  num[x] = -1;
  cout << "Закодированное сообщение: ";
  for (int i = 0; i < x+1; i++) cout << num[i] << " ";
  cout << endl;
  return(*num);
}
void decoder(int* code,int code_base,int x){
  char *decode = new char[x+1];
  memset(decode, 0, sizeof(decode));
  for (int i = 0; i < x; i++) {
    decode[i] = char(code[i]-code_base);
  }
  decode[x] = -1;
  cout << "Декодированное сообщение: ";
  cout << decode;
}
int main() {
  int code_base;
  cout << "Введите сдвиг шифрования: ";
  cin >> code_base;
  char code[] = "will see it";
  int x = strlen(code);
  int *num = new int[x+1];
  *num = coder(code,x,code_base);
  decoder(num,code_base,x);
}

Ответы

▲ 1Принят

Проблема проста как мир. В функции coder() вы создаёте массив num и возвращаете только первый элемент.

Рабочий код:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int* coder(char* code, int x, int code_base) {
  int *num = new int[x];
  for (int i = 0; i < x; i++) {
    num[i] = (int)code[i] + code_base;
  }
  cout << "Закодированное сообщение: ";
  for (int i = 0; i < x; i++) {
    cout << num[i] << " ";
  }
  cout << endl;
  return num;
}

void decoder(int* code, int code_base, int x){
  char *decode = new char[x+1];
  memset(decode, 0, x+1);
  for (int i = 0; i < x; i++) {
    decode[i] = char(code[i]-code_base);
  }
  cout << "Декодированное сообщение: ";
  cout << decode << endl;
  delete[] decode;
}

int main() {
  int code_base;
  cout << "Введите сдвиг шифрования: ";
  cin >> code_base;
  char code[] = "will see it";
  int x = strlen(code);
  int *num = coder(code, x, code_base);
  decoder(num, code_base, x);
  delete[] num;
  return 0;
}
▲ 0

Дело было в неверной передаче закодированного массива, я передавал только одно значение, ниже исправленный вариант

int *coder(char* code,int x,int code_base) {
      int *num = new int[x+1];
      for (int i = 0; i < x; i++) {
        num[i] = (int)code[i] + code_base;
      }
      num[x] = -1;
      cout << "Закодированное сообщение: ";
      for (int i = 0; i < x+1; i++) cout << num[i] << " ";
      cout << endl;
      return(num);
    }