我试图制作一个Caesar密码程序,但是我无法从最终的加密输出中删除空格。我用过:
if (letter == ' ')
continue;
然而,这似乎不起作用,我无法确定导致问题的原因。我已经很久没有使用C#了,所以它可能是一个愚蠢的错误。
如果我要将这个短语输入7:"我需要帮助"以下输出将是pAullkAolsw,所有空格都变为大写A.我希望输出的输出应该在示例中:p ullk olsw。
以下是我的完整代码:
using System;
class Program
{
static string Caesar(string value, int shift)
{
char[] buffer = value.ToCharArray();
for (int i = 0; i < buffer.Length; i++)
{
char letter = buffer[i];
letter = (char)(letter + shift);
if (letter == ' ')
continue;
if (letter > 'z')
{
letter = (char)(letter - 26);
}
else if (letter < 'a')
{
letter = (char)(letter + 26);
}
buffer[i] = letter;
}
return new string(buffer);
}
static void Main()
{
Console.WriteLine("Enter text to encrypt: ");
string buffer = Console.ReadLine();
Console.WriteLine("Enter value of shift: ");
int shift = int.Parse(Console.ReadLine());
string final = Caesar(buffer, shift);
Console.WriteLine(final);
}
}
答案 0 :(得分:2)
如果你想跳过空格,你只需要检查之前转换字母变量:
char letter = buffer[i];
if (letter == ' ')
continue;
letter = (char)(letter + shift);
// ...
答案 1 :(得分:0)
当且仅当您知道如何操作时(例如,如果您有a..z
或A..Z
字符),您应加密;如果您有不同的字符(空格,减号,引号,等等),只需保持原样:
using System.Linq;
...
static string Caesar(string value, int shift) {
//DONE: do not forget about validation
if (null == value)
return value; // or throw exception (ArgumentNullValue)
int n = 'z' - 'a' + 1;
// For each character in the value we have three cases:
// a..z letters - encrypt
// A..Z letters - encrypt
// other letters - leave intact
// "n + shift % n) % n" - let's support arbitrary shifts, e.g. 2017, -12345 etc.
return string.Concat(value
.Select(c =>
c >= 'a' && c <= 'z' ? (char) ('a' + (c - 'a' + n + shift % n) % n)
: c >= 'A' && c <= 'Z' ? (char) ('A' + (c - 'A' + n + shift % n) % n)
: c));
}
测试:
Console.Write(Caesar("Hello! It's a test for so called 'Caesar cipher'.", -2));
结果(请注意,空格,撇号,感叹号保持原样):
Fcjjm! Gr'q y rcqr dmp qm ayjjcb 'Aycqyp agnfcp'.