我有以下代码来加密字符串。
private void Crypt(int n, int m, int d)
{
n = Convert.ToInt32(n);
m = Convert.ToInt32(m);
d = Convert.ToInt32(d);
// make a block from the string
string invoerstring = invoer.Text;
int stringlength = invoerstring.Length;
var blok = invoer.Text.PadRight(stringlength, ' ').Substring(0, stringlength);
// the letters are shifted d times
char [] buf = invoerstring.ToArray<char>();
foreach (char c in buf)
{
var letter = uitvoer.Text += (char)( c + (char)d);
}
// shift characters inside a block
var shift = String.Concat(invoerstring.Skip(m).Concat(invoerstring.Take(m)));
uitvoer.Text = shift;
}
private void button1_Click(object sender, EventArgs e)
{
Crypt(8,2,1);
}
private void clearbutton_Click(object sender, EventArgs e)
{
invoer.Text = "";
uitvoer.Text = "";
}
}
}
这是练习的解释:
当我运行我的代码时,字母不会移动d次。例如字符串: “aap noot mies”必须改为“q oppubbjft n”(当Crypt是Crypt(8,2,1))。我需要更改什么才能获得此结果?
答案 0 :(得分:3)
你有很多问题/奇怪之处:</ p>
Convert
int
到Int32
s PadRight
s,但前者只是后者的合成糖。string
调用将返回初始字符串,因为您传递的长度等于Substring
的长度。blok
来电将返回初始字符串。string
。IEnumerable
已经实现了letter
(你已经隐式使用的事实),所以不需要将它转换为数组只是为了循环它。(char)( c + (char)d)
。uitvoer.Text
没有实现您正在寻找的Caeser cipher,您最终会将一些字母转换为非字母(除了一个退化的情况)。Concat
(不清除它),然后在不使用它的情况下覆盖它。string
的单个参数静态版本(将其传递的对象转换为string
)并将其传递给{{1}}。首先修复你知道该怎么做的问题,如果你遇到问题就编辑问题。