Итерации цикла while возвращают странные значения - PullRequest
0 голосов
/ 28 февраля 2019

У меня два вопроса:

Предположим, что символы, введенные пользователем в input, содержатся в alphabet:

  1. Если мой inputначинается с "A", первый символ в моем output - "A", но если я начну с любого другого символа в alphabet, output - это оригинальный символ, смещенный вправо на 3. Если мой input начинается с "A", почему мой output также начинается с "A", а не с "D"?

  2. Если мойinput - это строка с пробелами (например, "Stack Overflow"), почему первое слово является единственным компонентом моего output?(Как компьютер интерпретирует это?) Я понимаю, что C ++ рассматривает новые строки, пробелы и табуляции как пробел, но я подумал, что если бы пробел был в строке, он был бы обработан как символ. Как я могу изменить свой код, чтобы пространство и остальная часть моего input были включены (желательно смещены) в мой output?

using namespace std;

string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz @#$%^&*()";   //a 62 character string
string input, output;
int shift = 3, index = 0;

cin >> input;

while(index < input.length()){
   if(alphabet.find(input[index]) != NULL){
       output += alphabet[(alphabet.find(input[index]) + shift) % 62];
   }
   index++;
}

1 Ответ

0 голосов
/ 28 февраля 2019

Если мой ввод начинается с "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 есть кнопка для форматирования блоков кода.Просто выберите код и нажмите кнопку.

Код, встроенный в другой текст, может быть заключен в `` кавычки.

Нажмите кнопку ? в правой части панели инструментов редактора, чтобысм. поддерживаемую разметку форматирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...