while循环的迭代返回奇怪的值

问题描述 投票:0回答:1

我有两个问题:

假设用户在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++;
}
c++ visual-c++
1个回答
1
投票

如果我的输入以"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编辑器上的工具栏有一个用于格式化代码块的按钮。只需选择代码,然后按按钮。

其他文本的内联代码可以用``引号括起来。

单击编辑器工具栏右侧的?按钮以查看支持的格式标记。

© www.soinside.com 2019 - 2024. All rights reserved.