我有两个问题:
假设用户在input
中输入的字符都包含在alphabet
中:
input
以"A"
开头,我的output
中的第一个角色是"A"
,但如果我从alphabet
中的任何其他角色开始,output
是向右移动的原始角色3.如果我的input
以"A"
开头,为什么我的output
也从"A"
而不是"D"
开始?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++;
}
如果我的输入以
"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编辑器上的工具栏有一个用于格式化代码块的按钮。只需选择代码,然后按按钮。
其他文本的内联代码可以用``引号括起来。
单击编辑器工具栏右侧的?
按钮以查看支持的格式标记。