Можно ли хранить управляющие символы ASCII в строке? - PullRequest
0 голосов
/ 20 марта 2020

Я работаю над шифром Caesar Shift для своего школьного задания, и у меня возникают проблемы с реализацией функции ASCII. Проблема заключается в том, что смещение происходит за пределы диапазона ASCII [0, 127]. В настоящее время я% результата сдвига на 128, который по существу оборачивается вокруг таблицы ASCII. Однако значения 0-31 являются управляющими символами и неправильно сохраняются в строке. Это мешает мне расшифровать строку. Есть ли конкретная c структура данных, которую я должен использовать, чтобы сохранить все символы в таблице 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;
}

1 Ответ

1 голос
/ 22 марта 2020

В вашем коде есть две ошибки:

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

Функция strcpy предназначена для строк C. Используйте memcpy здесь.

return encrypted_str;

Как конструктор для std::string, вызываемый этим оператором return, должен знать, какова длина строки? Конструктор std::string, который принимает char *, предназначен только для строк в стиле C. Вызовите конструктор явно и передайте ему длину.

Если вы исправите эти две проблемы, ваши строки должны быть в состоянии правильно обрабатывать любой вид произвольного мусора, который вы хотите сохранить в них. Не используйте функции, предназначенные для строк C в стиле с произвольными данными.

...