2014-01-20 54 views
0

我有一段代码,我试图让它使用户放入他们的名字,我希望它能识别它是否是一个真正的名字。所以为了保持简单,我只希望它只接受字母。C#if else停止继续的代码

我输入了一个有效的名字,它会继续执行下一段代码。但是,当我输入无效字符时,我收到“无效名称”消息,但在此之后,无论我输入什么内容,都只会说“无效名称”。

Console.WriteLine("Please Enter First Name"); 
bool isNotName = true; 
string firstName = Console.ReadLine(); 

while (isNotName) 
{ 
    if (Regex.IsMatch(firstName, @"^[a-zA-Z]+$")) 
    { 
     { 
      Console.WriteLine("Welcome {0}", firstName); 
     } 
     isNotName = false; 
    }  
    else 
    { 
     Console.WriteLine("Invalid Name"); 
     Console.ReadLine(); 
    } 
} 
+0

在这行你是在读的名字吗?或者,更好的是,您实际设置'firstName'的唯一线路是什么? – Groo

+0

Obligatory“你有什么试过?” (通过你的代码,看看出了什么问题)和[Falsehoods Programmers Believe About Names](http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/)。此外,“无效名称”不是一个真正有用的错误,请解释用户如何输入有效名称。 – CodeCaster

+0

尝试逐行浏览您的代码,下次观看变量的值 - 您将自己发现这些错误。 –

回答

5
Console.WriteLine("Please Enter First Name"); 
bool isNotName = true; 
string firstName = Console.ReadLine(); 

while (isNotName) 
{ 
    if (Regex.IsMatch(firstName, @"^[a-zA-Z]+$")) 
    {    
     Console.WriteLine("Welcome {0}", firstName);    
     isNotName = false; 
    }  
    else 
    { 
     Console.WriteLine("Invalid Name"); 
     firstName = Console.ReadLine(); // <---- re-assign name here 
    } 
} 

另外我想重构代码移除布尔标志:

Console.WriteLine("Please Enter First Name"); 
string firstName = Console.ReadLine(); 

while(!Regex.IsMatch(firstName, @"^[a-zA-Z]+$")) 
{ 
    Console.WriteLine("Invalid Name"); 
    firstName = Console.ReadLine(); 
} 

Console.WriteLine("Welcome {0}", firstName); 
5

上面firstName值不更新循环,所以试试这个:

string firstName = Console.ReadLine(); 

while (isNotName) 
{ 
    if (Regex.IsMatch(firstName, @"^[a-zA-Z]+$")) 
    { 
     { 
     Console.WriteLine("Welcome {0}", firstName); 
     } 
     isNotName = false; 
    } 

    else 
    { 
     Console.WriteLine("Invalid Name"); 
     firstName = Console.ReadLine(); 
    } 
} 
2

你问题在这里的条件的其他部分:

Console.ReadLine(); 

它应该是:

firstName = Console.ReadLine(); 

发生了什么事是,你节省了用户输入您第一次从控制台读取输入而不是将其保存在以后调用的ReadLine()

即您的代码应该是:

Console.WriteLine("Please Enter First Name"); 
bool isNotName = true; 
string firstName = Console.ReadLine(); 

while (isNotName) 
{ 
    if (Regex.IsMatch(firstName, @"^[a-zA-Z]+$")) 
    { 
     Console.WriteLine("Welcome {0}", firstName); 
     isNotName = false; 
    }  
    else 
    { 
     Console.WriteLine("Invalid Name"); 
     firstName = Console.ReadLine(); 
    } 
} 
1

您只读了一次该名称。

在while循环开始时使用string firstName = Console.ReadLine();

Console.WriteLine("Invalid Name"); 
    firstName = Console.ReadLine(); 
1

在你的其他部分

else 
{ 
firstName = Console.ReadLine(); 
} 
1

您没有设置的firstName变量在随后的ReadLine试试这个像这样:

string firstName; 
while (!(Regex.IsMatch(firstName = Console.ReadLine(), @"^[a-zA-Z]+$"))) 
{ 
    Console.WriteLine("Invalid Name"); 
} 

Console.WriteLine("Welcome {0}", firstName); 

这只是为lulz,虽然,分配内部con词义表达总是一个坏主意。 :)

0

只是为了尽量原创,你的同龄人可能会喜欢读的东西:

0

错误是,firstName的值永远不会更新。

的代码可以改进:

Console.WriteLine("Please Enter First Name"); 
string firstName = Console.ReadLine(); 
While (!Regex.IsMatch(firstName, @"^[a-zA-Z'-]+$")) { 
    Console.WriteLine("Invalid Name"); 
    firstName = Console.ReadLine(); 
} 
Console.WriteLine("Welcome {0}", firstName);