2017-11-19 21 views
1

私のプログラムは、文字列内の3つの連続した文字をチェックする必要があります(そして文字列全体をチェックしてください)。私はそれが 『『をチェックし、』WER「をチェック』、「QWEをチェックし、」ERTのように、harcoded方法でそれらをチェック作ることができますが、それは厄介とひどく行わ見えます。文字列の3つの連続する文字をチェックする方法は?

static void Main(string[] args) 
{ 
    string BadLetters = "qwertyuiopasdfghjklzxcvbnm"; 
    string password = "Blablauio"; 

    for (int i = 1; i <= 30; i++) 
    { 
     // This checks if it contains "qwe" but i want it to 
     // cycle through the rest (such as "wer" or "rty") 
     if (password.Contains(BadLetters.Substring(0, 3)))    { 
      Console.WriteLine("password contains 3 consequtive letters in BadLetters");      
     } 
    } 

    Console.ReadKey(); 
} 

問題がありますこれはBadLetters(qwe)の最初の3文字だけをチェックし、 "ert"は探しません。

+0

'firstletter'と' secondletter'は何のヌル状態をチェックする必要があるかもしれないのですか? –

+0

申し訳ありませんが、0と3と宣言されている必要があります。0と3と言っていると思います.1と4,2,5などに循環したいので、文字列の部分をチェックします – trisyntax

+0

提案:

答えて

1

をあなたの文字列を理解しましたパスワードが3文字以上であることを確認してください。あなたの代わりにこれを行うことができるように
このループは、キーボードの行の交差手紙に正しい値と考えるべきであるすなわち「OPA」または「PAS」を、失敗する可能性:

string badLettersR1 = "qwertyuiop"; 
string badLettersR2 = "asdfghjkl"; 
string badLettersR3 = "zxcvbnm"; 
string password = "Blablauio"; 
for (int i = 0; i < password.Length-2; i++) 
{ 
    if (badLettersR1.Contains(password.Substring(i,3)) || 
     badLettersR2.Contains(password.Substring(i,3)) || 
     badLettersR3.Contains(password.Substring(i,3))) 
    { 
     Console.WriteLine("password contains 3 consequtive letters in BadLetters"); 
    } 
} 
0

多分あなたの文字列を編集しようとすると3文字が消えてしまいます

firstlettersecondletter 4を追加することで、最初の3もスキップして、次のように繰り返すことができますあなたも持って明らかに

string badLetters = "qwertyuiopasdfghjklzxcvbnm"; 
    string password = "Blablauio"; 
    for (int i = 0; i < password.Length-2; i++) 
    { 
     if (badLetters.Contains(password.Substring(i,3))) 
     { 
      Console.WriteLine("password contains 3 consequtive letters in BadLetters"); 
     } 
    } 

:ウイングもの

SRYは私ではなく、パスワードの変数にあなたがループ場合、それはこのように、良いだろう...行の3通り

0

あなたは内の各文字を反復処理する必要がありますpasswordの場合、BadLettersにインデックスを見つけ、passwordの次の2文字がBadLettersの次の2文字と一致するかどうかを確認します。あなただけpassword

string BadLetters = "qwertyuiopasdfghjklzxcvbnm"; 
string password = "Blablauio"; 
for (int i = 0; i < password.Length - 2; i++) 
{ 
    var j = BadLetters.IndexOf(password[i]); 
    if (j > -1 && j + 2 < BadLetters.Length && 
     password[i + 1] == BadLetters[j + 1] && 
     password[i + 2] == BadLetters[j + 2]) 
    { 
     Console.WriteLine("password contains 3 consequtive letters in BadLetters"); 
    } 
} 
0

TLに終わりから3番目の文字を反復処理する必要があるので、私はまたfor loopの停止条件を変更します。 DR

あなただけのシンボルの配列を通過し、それはこのようインデックスをです比較することができます:

if (BadLetters.IndexOf(my_word[i]) - BadLetter.IndexOf(my_word[i-1]) == 1) { 
    Console.WriteLine("Consequent letters detected!"); 
} 

あなた可能性だけ、カウント結果としての文字とアラート数より3

その後、Iキーボードのすべての行で詳細なコードを入力します。また、コードを変更せずに別の行(大文字)を追加することもできます。

また、Nの文字列に禁じられた結果文字が表示されます。

q - ok 
qw - ok 
qwe - password contains 3 consequtive letters in BadLetters 
abdfsk - ok 
ehjk - password contains 3 consequtive letters in BadLetters 
bnm - password contains 3 consequtive letters in BadLetters 

コード

コードで:

はまた、作業の結果を実証するためにのみ使用Check方法があります。ネットフィドル:GetLine関数は行番号と文字インデックスを返し、その後の文字が、ペア(LetterLine、LetterIndex)だけでなく、を比較する場合https://dotnetfiddle.net/4oILkj

public static String[] KeyboardLines = new [] { 
    "1234567890", 
    "qwertyuiop[]", 
    "asdfghjkl;'\\", 
    "`zxcvbnm,./" 
}; 

public static Int32 GetLine(char c){ 
    for (int i = 0; i < KeyboardLines.Length; i++) { 
     if (KeyboardLines[i].IndexOf(c) > -1) { 
      return i; 
     }; 
    } 
    return -1; 
} 

public static bool HasConsequenceLetters(string str, int n = 3) { 
    if (str.Length < n) { 
     return false; 
    } 

    char previousLetter = str[0]; 
    int previousLine = GetLine(previousLetter); 
    int previousLetterIndex = KeyboardLines[previousLine].IndexOf(previousLetter); 
    Int32 consequentLettersCount = 1; 


    for (int i = 1; i < str.Length; i++) { 
     var currentLetter = str[i]; 
     var currentLine = GetLine(currentLetter); 
     var currentLetterIndex = KeyboardLines[currentLine].IndexOf(currentLetter); 

     if (currentLine != -1 && currentLine == previousLine) { 
      if (currentLetterIndex - previousLetterIndex == 1) { 
       consequentLettersCount += 1; 
      } 
     } 
     else { 
      consequentLettersCount = 1; 
     } 

     if (consequentLettersCount == n) { 
      return true; 
     } 

     previousLetter = currentLetter; 
     previousLetterIndex = currentLetterIndex; 
     previousLine = currentLine; 
    } 
    return false; 
} 

改善

このアプローチを向上させることができました。しかし、これはタプルやクラスの使用を私たちに要求しますが、私はあなたが本当にこれを望んでいるとは思わない。

0

私が見つけたシンプルなものが

using System; 

public class Program 
{ 
    public static void Main() 
    { 
     string BadLetters = "qwertyuiopasdfghjklzxcvbnm"; 
     string password = "Blablauio"; 
     Console.WriteLine(password.IndexOf(BadLetters.Substring(0,3))>=0?"Present":"Not Present"); 
     Console.ReadLine(); 
    } 
} 

あなたは両方の文字列