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

C++ 是否可以将ASCII控制字符存储在字符串中?,c++,encryption,caesar-cipher,C++,Encryption,Caesar Cipher,我正在为我的学校作业编写凯撒移位密码,但在实现ASCII环绕功能时遇到了问题。问题是当移位发生在ASCII范围[0127]之外时。我目前认为移位128的结果是%的,这基本上围绕着ASCII表。但是,值0-31是控制字符,未正确存储在字符串中。这使我无法解密字符串。我是否应该使用特定的数据结构来保留ASCII表中的所有字符 这是我的密码: std::string shift(const std::string& str) { int shift_pos = 9; char

我正在为我的学校作业编写凯撒移位密码,但在实现ASCII环绕功能时遇到了问题。问题是当移位发生在ASCII范围[0127]之外时。我目前认为移位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;
}
std::string移位(const std::string&str){
int shift_pos=9;
char-original_str[str.length()];
字符加密的字符串[str.length()];
std::strcpy(原始str,str.c_str());
对于(int i=0;i
您的代码中有两个错误:

std::strcpy(original_str, str.c_str());
strcpy
函数用于C样式字符串。在此处使用
memcpy

return encrypted_str;
这个
return
语句调用的
std::string
的构造函数应该如何知道字符串的长度?采用
char*
std::string
构造函数仅适用于C样式的字符串。显式调用构造函数并将长度传递给它


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

为什么
QTString
而不是
std::string
?我希望在这里的某个地方看到
%26
,而不是
%128
@tadman,因为这是作业的要求。之所以是128,是因为ascii表中有128个值,因此如果该值超出ascii范围3,则该值应编码为STX字符,因为这是ascii表中的第三个值。提示:它不是128。这个数字与凯撒密码毫无关系,凯撒密码在7位ASCII之前已经存在很长时间了。有多少个字母?如果字符串包含像“@$%”这样的非字母数字字符怎么办?