Если мой ввод начинается с "A"
, первый символ в моем output
будет "A"
, но если я начну с любого другого символа в алфавите, output
- это исходный символ, смещенный кпрямо на 3. Если мой input
начинается с "A"
, почему мой output
также начинается с "A", а не с "D"
?
Этоне делает.Он пропускает "A"
и вообще не добавляет его к output
!
Это потому, что std::string::find()
НЕ возвращает указатель, он возвращает индекс.Если он не находит соответствия, он возвращает std::string::npos
(-1).Сравнение NULL
с индексом трактует NULL
как индекс 0. Таким образом, когда find()
находит "A"
, он возвращает 0, который затем сравнивается как равный NULL
(0) и, таким образом, пропустите , добавив "D"
к output
.Все остальные input
символы дают find()
возвращаемые индексы, отличные от 0, поэтому они не сравниваются равными NULL
, и поэтому вы сдвигаете их все (включая те, которые заставляют find()
возвращать npos
,Вы перемещаете все это в индекс 2).
Если мой input
является строкой с пробелами (например, "Stack Overflow"
), почему первое слово является единственным компонентом моегоoutput
?(Как компьютер интерпретирует это?) Я понимаю, что C ++ рассматривает новые строки, пробелы и табуляции как пробельные символы, но я подумал, что если бы пробел был в строке, он был бы обработан как символ. Как я могу изменить свой код, чтобы пространство и остальная часть моего input
были включены (желательно смещены) в мои output
?
operator>>
читает пробельные символы-слова с разделителями.Сначала он пропускает начальные пробелы (если не используется std::noskipws
), а затем читает, пока не встретит пробелы.Чтобы прочитать строку с пробелами в ней, вместо этого используйте std::getline()
.
С учетом сказанного попробуйте вместо этого:
using namespace std;
const string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz @#$%^&*()"; //a 62 character string
string input, output;
const int shift = 3;
getline(cin, input);
for (string::size_type index = 0; index < input.length(); ++index) {
string::size_type found_index = alphabet.find(input[index]);
if (found_index != string::npos) {
output += alphabet[(found_index + shift) % alphabet.size()];
}
}
/*
Or, using C++11 or later:
for (char c : input) {
auto found_index = alphabet.find(c);
... (same as above) ...
}
*/
Кроме того, как происходит форматирование переменных при запросевопросы по StackOverflow, чтобы они были в маленьких блоках кода при написании вопроса?Я вижу это на постах других людей, но я не знаю, как это сделать, и это делает вещи более читабельными.
Блоки кода могут иметь отступ в 4 пробела.На панели инструментов редактора StackOverflow есть кнопка для форматирования блоков кода.Просто выберите код и нажмите кнопку.
Код, встроенный в другой текст, может быть заключен в `` кавычки.
Нажмите кнопку ?
в правой части панели инструментов редактора, чтобысм. поддерживаемую разметку форматирования.