Cần giải đáp về con trỏ và mảng

Xin chào các anh chị, em mới tìm hiểu về con trỏ và còn đang lơ mơ ạ.
Em đang có bài tập như sau ạ:

Trong bài tập trước đó, bạn đã được biết đến cách quân đội Ấn Độ mã hóa các thông điệp được gửi đi trong cuộc chiến với Pakistan.

Lần này, với vai trò là một quân nhân tại Trung tâm chỉ huy, hãy viết hàm để giải mã thông điệp được gửi đến từ ngài Tổng thâm mưu (Tổng thống Ấn Độ).

Biết rằng, lần này thông điệp gửi đến là địa chỉ đến tệp hồ sơ liên quan đến cuộc tấn công sắp tới, hãy giải mã thông điệp để tìm ra địa chỉ tệp và lấy ra thông tin chứa trong tệp tài liệu đó.

Viết hàm void decrypt (int k, char * message) nhận 2 tham số đầu vào là khóa giải mã k và thông điệp message

Hàm in ra toàn bộ thông tin được lưu trữ trong tệp tại đường dẫn message đã được giải mã theo khóa k.

Lưu ý: Hàm chỉ mã hóa các kí tự và số (A−Z,a−z,0−9). Tất cả các kí tự khác được giữ nguyên.

Ví dụ:

Input
4 // key
hsgyqirx5 // message decoded: document1 (path)
Output
This is a special day and we will do nothing :slight_smile:

Em nghĩ cách giải là dùng mã Ascii của từng ký tự - k, sau đó xuất ra ký tự ứng với mã đó sẽ tìm được path của tệp chứa output. Tuy nhiên khi em viết ctrinh gặp vấn đề như ảnh dưới:


mong anh chị giúp em giải đáp vấn đề này ạ.
Code của em nếu cần thiết ạ :

#include <iostream>
#include <ctype.h>
#include <string.h>
#include <chrono>
#include <thread>
using namespace std;
void decrypt (int k, char * message)
{
   int n= sizeof(message);
   int tam;
   for (int i=1; i<=n; ++i)
   {
       tam = static_cast<char>(message+i)-4;
       char gan(tam);
       cout << gan;
   }
}
int main()
{
    int k;
    char *message;
    cin >> k >> message;
    decrypt(k,message);
    return 0;
}
1 Like

Bạn đang ép kiểu từ con trỏ về kiểu không con trỏ. Tức là bạn đang cố ép giá trị địa chỉ về số.
Kiểu bạn cần in ra cũng là kiểu char thôi mà. Trong C/C++ có toán tử để lấy giá trị của con trỏ rồi, đâu phải làm cái ép kiểu khổ sở vậy?
Từ khóa: dereference pointer. Đó là toán tử hoa thị/dấu sao (*).
Hoặc có thể truy xuất như mảng.

char x = *(message+i) - k;
char x = message[i] - k; // như mảng

Đây là mã hóa Caesar phải không? Bạn có thể còn quên 1 thứ. Các kí tự cuối lại vòng về đầu.

4 Likes

dạ em đã hiểu rồi ạ, cám ơn anh nhiều ạ

không biết bạn đã AC bài này chưa ạ, mình muốn tham khảo code ạ

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?