user3320668
user3320668

Reputation: 23

C# how can I check users input

I´m having a string with allowed chars. I´d like that user is only able to use this chars. My idea was to loop through the unser inputs string and compare char for char. But the problem which I have is when the first char in string allowed is "A" and the first in the users input "B" is, it gives me an error...

Totally confused right now

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);
    }
}

Upvotes: 0

Views: 1975

Answers (4)

PiotrWolkowski
PiotrWolkowski

Reputation: 8782

When using a collection to store not allowed items (instead of a plain string) it opens a whole new spectrum of LINQ expressions you can use:

    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);
        }
    }

Upvotes: 0

enzi
enzi

Reputation: 4165

You need another loop in your first one:

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);
   }
}

Right now, what you're saying is "every character in read must be exactly the same as in allowed". What you're trying to say (I think) is "every character in read must be present somewhere in allowed" – that's what the second loop does. It looks for the character in allowed and if it finds it, sets isValid to true. Otherwise the character wasn't found and it's incorrect.


As other answers here state, you can use LINQ or (preferrably) regular expressions (regex) for things like this. I assume this is homework, or you're new to C# or programming, so I provided a basic answer to (hopefully) help you understand what's not working currently with your code.

If this should indeed be a homerwok or studying-related question, then let me recommend you put that in your question next time, for it's not forbidden to ask about homework.

The "real world" solutions we would use are of no help to you if you're trying to figure out the basics, so if we know it's about learning stuff then we'll provide answers that are more useful for you.

Upvotes: 0

Thorsten Dittmar
Thorsten Dittmar

Reputation: 56697

You either need to search the char of user input within the allowed characters or you could use a regular expression.

Search approach:

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
    }
}

Regular expression approach:

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

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

Please note that the regular expression approach is more flexible. If you learn about regular expressions, you will find it very powerful.

Upvotes: 0

Selman Gen&#231;
Selman Gen&#231;

Reputation: 101681

If you wanna check if the user input has any of not allowed characters you need a nested loop, because you wanna compare each char in the user input against the chars in the allowed:

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;
    }
}

Or, to simplify this you can use LINQ:

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

If you want to know which chars are invalid, you can use Except method:

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

Upvotes: 1

Related Questions