2014-12-10 4 views
0

У меня есть строка с разрешенными символами. Я хотел бы, чтобы этот пользователь мог использовать только эти символы. Моя идея состояла в том, чтобы прокручивать строку входных данных unser и сравнивать char для char. Но проблема, которая у меня есть, когда первый символ в строке разрешен «А» и первый в пользователях ввода «B», оно дает мне ошибку ...C# как я могу проверить вход пользователей

Полностью смущена прямо сейчас

string allowed = "abc"; 
string read= Console.ReadLine(); 

for (int i = 0; i < allowed.Length; i++) 
{ 
    if (allowed[i] == read[i]) 
    { 
     Console.WriteLine("Okay"); 
    } 
    else 
    { 
     Console.WriteLine("Invalid char on" +index); 
    } 
} 
+0

насчет 'если (разрешено == чтения)' ? – Habib

+1

Значит, ты говоришь, что мне даже не нужна петля? – user3320668

+0

Нет, если вы собираетесь сравнивать строки в текущем сценарии. Вы также можете посмотреть перегрузку «String.Equals», которая также обеспечивает нечувствительность к регистру. – Habib

ответ

1

Если вы хотите проверить, если пользовательский ввод имеет какой-либо из не разрешенных символов, которые необходимо вложенный цикл, потому что вы хотите сравнить каждый символ на входе пользователя в отношении символов в разрешенном:

foreach(var r in read) 
{ 
    bool isValid = false; 
    foreach(var c in allowed) 
    { 
     // if we found a valid char set isValid to true 
     if(c == r) 
      isValid = true; 
    } 
    // if it's still false then the current char 
    // doesn't match any of the allowed chars 
    // so it's invalid 
    if(!isValid) 
    { 
     Console.WriteLine("the string has invalid char(s)"); 
     break; 
    } 
} 

Или, упростите это, вы можете использовать LINQ:

bool isInvalid = read.Any(c => !allowed.Contains(c)); 

Если вы хотите знать, какие символы являются недействительными, вы можете использовать Except метод:

var invalidChars = read.Except(allowed); 
foreach(var c in invalidChars) 
{ 
    Console.WriteLine(c); 
} 
+0

Спасибо. Это помогло мне. Теперь я знаю, что моя первая идея была правильной. Я думал, что это никогда не сработает, если (c == r). Ах, человек, я никогда не пойму логику программирования языка ... Еще раз спасибо. – user3320668

0

Вам придется либо искать полукокс из пользовательского ввода в пределах допустимых символов или вы могли бы использовать регулярное выражение.

Поиск подход:

private string allowed = "abc"; 
private string userInput = "some string entered"; 

bool stringIsValid = false; 
for (int i = 0; i < userInput.Length; i++) 
{ 
    if (!allowed.IndexOf(userInput[i])) 
    { 
     stringIsValid = false; 
     break; // You can stop the loop upon the first occurance of an invalid char 
    } 
} 

Регулярное выражение подход:

private string allowed = "abc"; 
private string userInput = "some string entered"; 

bool stringIsValid = Regex.IsMatch(allowed, userInput); 

Пожалуйста, обратите внимание, что регулярное выражение подход является более гибким. Если вы узнаете о регулярных выражениях, вы найдете его очень мощным.

+0

Спасибо за это очень приятное и визуальное решение. И спасибо за советы по регулярным выражениям, собираюсь проверить это! – user3320668

0

Вам нужен другой цикл в вашей первой:

string allowed = "abc"; 
string read= Console.ReadLine(); 

for (int i = 0; i < read.Length; i++) 
{ 
    bool isValid = false; 
    for (int j = 0; j < allowed.Length; j++) 
    { 
     if (read[i] == allowed[j]) 
     { 
     isValid = true; 
     break; 
     } 
    } 
    if (isValid) 
    { 
    Console.WriteLine("Okay"); 
    }else{ 
    Console.WriteLine("Invalid char on" +index); 
    } 
} 

Прямо сейчас, что вы говорите, «каждый символ read должен быть точно такой же, как и в allowed». То, что вы пытаетесь сказать (я думаю), - «каждый символ в read должен присутствовать где-то в allowed» - вот что делает второй цикл. Он ищет персонажа в allowed и, если он его найдет, устанавливает isValid в true. В противном случае символ не был найден, и он неверен.


Как и другие ответы здесь состояние, вы можете использовать LINQ или (желательно) регулярные выражения (регулярное выражение) для подобных вещей. Я предполагаю, что это домашняя работа, или вы новичок в C# или программировании, поэтому я дал базовый ответ (надеюсь) помочь вам понять, что не работает в настоящее время с вашим кодом.

Если это действительно вопрос homerwok или вопросов, связанных с обучением, то позвольте мне порекомендовать вас поставить это в ваш вопрос в следующий раз, так как не обязательно спрашивать о домашнем задании.

Решения «реального мира», которые мы будем использовать, не помогут вам, если вы пытаетесь выяснить основы, поэтому, если мы знаем, что это касается учебных материалов, тогда мы предоставим вам более полезные ответы ,

0

При использовании коллекции для хранения не допускается предметов (вместо простой строки) он открывает целый новый спектр выражений LINQ вы можете использовать:

public static void Main(string[] args) 
    { 
     var allowed = new List<string> { "a", "b", "c" }; 
     var read = Console.ReadLine().Select(c => c.ToString()).ToList(); 

     if (read.All(allowed.Contains)) 
     { 
      Console.WriteLine("Okay"); 
     } 
     else 
     { 
      var firstNotAllowed = read.First(a => !allowed.Contains(a)); 
      var firstIndex = read.FindIndex(a => !allowed.Contains(a)); 
      Console.WriteLine("Invalid char: {0}, at index: {1}", firstNotAllowed, firstIndex); 
     } 
    } 
Смежные вопросы