2017-11-02 7 views
2

シーザー暗号プログラムを作成しようとしていますが、最後の暗号化された出力からスペースを削除できません。私は使用しました:シーザー暗号の文字列からスペースを削除する問題#

しかし、これは動作していないようだと私は問題の原因を特定することはできません。私は非常に長いので、おそらく愚かなエラーになる可能性があります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

シフトされた文字が ''であるかどうかを確認します。あなたはシフトの前にチェックする必要があります。編集:スペースを完全に削除する場合は、バッファ[i]を変更する代わりに、新しいchar []に書き込む必要があります。 (解読するときにスペースがないことに注意してください) – TheSkimek

+0

愚かな間違い:+シフトを行う前にスペースをテストしてください。 – Rob

+0

ええ、今は明らかですが、少なくとも私はそれを覚えています。 –

答えて

2

スペースをスキップしたい場合は、ちょうどあなたが文字変数を変​​換前をチェックする必要があります。

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

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

ありがとう、私はコードが実行される順序を考慮するとは思わなかった。 –

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'. 
関連する問題