是否可以在字符串中存储 ASCII 控制字符?
Is it possible to store ASCII control characters in a string?
我正在为我的学校作业编写凯撒移位密码,但在实现 ASCII 环绕功能时遇到了问题。问题是当移位超出 ASCII 范围 [0, 127] 时。我目前将 % 移位的结果乘以 128,这基本上环绕了 ASCII table。但是,值 0-31 是控制字符,未正确存储在字符串中。这使我无法解密字符串。是否应该使用特定的数据结构来保留 ASCII table 中的所有字符?
这是我的代码:
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::strcpy(original_str, str.c_str());
strcpy
函数用于 C 风格的字符串。这里使用memcpy
。
return encrypted_str;
此 return
语句调用的 std::string
的构造函数应该如何知道字符串的长度?采用 char *
的 std::string
构造函数仅适用于 C 风格的字符串。显式调用构造函数并将长度传递给它。
如果您解决了这两个问题,您的字符串应该能够正确处理您想要存储在其中的任何类型的任意垃圾。不要使用任何适用于具有任意数据的 C 风格字符串的函数。
我正在为我的学校作业编写凯撒移位密码,但在实现 ASCII 环绕功能时遇到了问题。问题是当移位超出 ASCII 范围 [0, 127] 时。我目前将 % 移位的结果乘以 128,这基本上环绕了 ASCII table。但是,值 0-31 是控制字符,未正确存储在字符串中。这使我无法解密字符串。是否应该使用特定的数据结构来保留 ASCII table 中的所有字符?
这是我的代码:
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::strcpy(original_str, str.c_str());
strcpy
函数用于 C 风格的字符串。这里使用memcpy
。
return encrypted_str;
此 return
语句调用的 std::string
的构造函数应该如何知道字符串的长度?采用 char *
的 std::string
构造函数仅适用于 C 风格的字符串。显式调用构造函数并将长度传递给它。
如果您解决了这两个问题,您的字符串应该能够正确处理您想要存储在其中的任何类型的任意垃圾。不要使用任何适用于具有任意数据的 C 风格字符串的函数。