因此,我正在尝试使用C#进行编程,绝对没有任何超越性。所以我尝试制作一个简单的程序,读取用户输入并再次输出给用户。现在这个名字部分都很好,但是当我尝试输入我的年龄时。 20岁,它总是写着“你的输入已被保存。你已经49岁了。”无论我输入什么数字,它总是给我49,我在代码中看不出会导致这个问题。你知道什么是错的吗?
Console.Write("Insert Age: ");
int age = Convert.ToInt32(Console.Read());
if (age < 18)
{
Console.WriteLine("Whoops! Looks like you are only " + age + " Year(s) old! You are too young to have your input saved.");
}
else
{
Console.WriteLine("Your input has been saved. You are " + age + " Year(s) old.");
}
Console.Read()方法只从控制台读取一个字符。如果要读取数字,例如20或77,则需要Console.ReadLine()方法。这将读取包含您的号码的整行。
我强烈建议您使用int.TryParse()方法而不是Convert.ToInt32()方法,因为在某些情况下转换将失败。例如,如果有人以错误的格式输入输入,他将引入这一行:20a。然后你的程序会崩溃。
使用int.TryParse()方法非常简单。您的代码将如下所示:
Console.Write("Insert Age: ");
if( true == int.TryParse(Console.ReadLine()) )
{
if (age < 18)
{
Console.WriteLine("Whoops! Looks like you are only " + age
+ " Year(s) old! You are too young to have your input saved.");
}
else
{
Console.WriteLine("Your input has been saved. You are "
+ age + " Year(s) old.");
}
}
else
{
Console.WriteLine("This is not a number."); // Or any message you want
}
为了缩短这段代码,您可以尝试编写如下代码:
Console.Write("Insert Age: ");
if( true == int.TryParse(Console.ReadLine()) )
{
Console.WriteLine( age < 18 ?
"Whoops! Looks like you are only " + age +
" Year(s) old! You are too young to have your input saved." :
"Your input has been saved. You are " + age + " Year(s) old.");
}
else
{
Console.WriteLine("This is not a number."); // Or any message you want
}
如果你想更短,那么试试:
Console.Write("Insert Age: ");
Console.WriteLine( int.TryParse(Console.ReadLine()) ?
(age < 18 ?
"Whoops! Looks like you are only " + age
+ " Year(s) old! You are too young to have your input saved."
: "Your input has been saved. You are " + age + " Year(s) old.")
: "This is not a number.");
这个问题是一个基本的理解问题。 .NET在这里做的一切都很好。
请看看Console.Read()方法。如您所见,它返回Int32
值。意思是,在你的情况下:它读取输入流的第一个char
。如果在控制台中输入“23”,那么2被认为是char
,根据ASCII,它代表值50.然后,你取50并将其转换为整数:age = 50
。
可能解决方案
根据MSDN
int age = Convert.ToInt32(Console.ReadLine());
希望有所帮助。
Console.Read()
只从标准输入中读取下一个字符,Console.ReadLine()
从标准输入流中读取下一行字符。
来自@VMAtm的逐字来源:Difference between Console.Read() and Console.ReadLine()?