是否可以在字符串中存储ASCII控制字符?

问题描述 投票:-2回答:1

我正在为我的学校作业使用Caesar Shift密码,并且在实现ASCII环绕功能时遇到了麻烦。问题是当移位发生时超出ASCII范围[0,127]的大小。我目前%移位128的结果,该移位实际上环绕着ASCII表。但是,值0-31是控制字符,并且没有正确存储在字符串中。这使我无法解密字符串。是否应使用特定的数据结构来保留ASCII表中的所有字符?

这是我的代码:

std::string shift(const std::string& str) {
    int shift_pos = 9;
    char original_str[str.length()];
    char encrypted_str[str.length()];
    std::strcpy(original_str, str.c_str());
    for (int i = 0; i < str.length(); i++) {
        encrypted_str[i] = (original_str[i] + shift_pos) % 128;
    }
    return encrypted_str;
}
c++ encryption caesar-cipher
1个回答
0
投票

您的代码中有两个错误:

std::strcpy(original_str, str.c_str());

strcpy函数适用于C风格的字符串。在此处使用memcpy

return encrypted_str;

std::string语句所调用的return的构造函数应该如何知道字符串的长度?需要std::stringchar *构造函数仅适用于C样式的字符串。显式调用构造函数并将其长度传递给它。

如果解决了这两个问题,则您的字符串应该能够正确处理要存储在其中的任何种类的垃圾。不要对带有任意数据的C型字符串使用任何函数。

© www.soinside.com 2019 - 2024. All rights reserved.