C# caesar密码c中从字符串中删除空格的问题#

C# caesar密码c中从字符串中删除空格的问题#,c#,caesar-cipher,C#,Caesar Cipher,我正在尝试制作一个Caesar密码程序,但是我无法从最终加密的输出中删除空格。我用过: if (letter == ' ') continue; 然而,这似乎不起作用,我无法确定是什么导致了这个问题。我使用C#的时间不长,所以这可能是一个愚蠢的错误 如果我输入的短语移位为7:“我需要帮助”,则以下输出将是pAullkAolsw,所有空格都变成大写a。我希望的输出应该在示例中:p ullk olsw 以下是我的完整代码: using System; class

我正在尝试制作一个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);
   }
}
使用系统;
班级计划
{
静态字符串Caesar(字符串值,int移位)
{
char[]buffer=value.ToCharArray();
for(int i=0;i'z')
{
字母=(字符)(字母-26);
}
否则如果(字母<'a')
{
字母=(字符)(字母+26);
}
缓冲区[i]=字母;
}
返回新字符串(缓冲区);
}
静态void Main()
{
WriteLine(“输入要加密的文本:”);
字符串缓冲区=Console.ReadLine();
Console.WriteLine(“输入移位值:”);
int shift=int.Parse(Console.ReadLine());
字符串final=Caesar(缓冲区、移位);
控制台写入线(最终);
}
}

如果要跳过空格,只需在转换字母变量之前选中

char letter = buffer[i];
if (letter == ' ')
    continue;

letter = (char)(letter + shift);
// ...

当且仅当您知道如何加密时(即,如果您有
a..z
a..z
字符);如果您有不同的字符(空格、减号、引号等),请保持原样:

结果(请注意,空格、撇号和感叹号保持原样):


检查移位的字母是否为“”。你必须在换班前检查一下。编辑:如果要完全删除空格,则必须写入新的char[],而不是更改缓冲区[i]。(请注意,解密时不会有空格)是的,愚蠢的错误:在做+移位之前测试空格。是的,现在看起来很明显,至少我会记住它,因为将来要小心,一般情况下你应该使用模算术;反例-
shift=100
shift=-100
这里要学习的课程是变量应该有一个含义。在这里,您使用
字母
来表示明文和密文,但它们在逻辑上是不同的,因此为它们设置不同的变量。具有各种经验的程序员有时表现得好像变量很昂贵,但局部变量是最便宜的东西;如果它使程序更容易跟随,使用尽可能多的方法。谢谢你,我甚至没有想到要考虑代码运行的顺序。
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'.