C# 为什么这个C代码输出了错误的整数?

C# 为什么这个C代码输出了错误的整数?,c#,C#,因此,我现在正试图在毫无经验的情况下开始使用C语言编程。所以我试着制作一个简单的程序,读取用户输入并再次输出给用户。现在名称部分很好,但当我尝试输入我的年龄,例如20岁/岁时,它总是写“您的输入已保存。您是49岁。”无论我输入什么数字,它总是给我49岁,我看不出代码中有任何问题会导致这种情况。你知道怎么了吗 Console.Write("Insert Age: "); int age = Convert.ToInt32(Console.Read());

因此,我现在正试图在毫无经验的情况下开始使用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.Write(“插入年龄:”);
int age=Convert.ToInt32(Console.Read());
if(年龄<18岁)
{
Console.WriteLine(“哎哟!看起来你只有“+age+”岁!你太年轻了,无法保存输入。”);
}
其他的
{
Console.WriteLine(“您的输入已保存。您是“+年龄+”岁。”);
}
仅从标准输入读取下一个字符, 并从标准输入流中读取下一行字符


来源逐字记录来源:
这个问题是一个基本的理解问题。NET在这里一切都很好

请看一下这个方法。如您所见,它返回一个
Int32
值。在您的例子中,这意味着:它读取输入流的第一个
char
。如果在控制台中输入“23”,则2将被视为
字符
,根据,它表示值50。然后,取50并将其转换为整数:
age=50

可能的解决方案

希望有帮助

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(“插入年龄:”);
if(true==int.TryParse(Console.ReadLine())
{
if(年龄<18岁)
{
控制台。WriteLine(“哎哟!看起来你只是”+年龄
+“岁!您太年轻,无法保存输入。”);
}
其他的
{
Console.WriteLine(“您的输入已保存。您是”
+年龄+“岁”;
}
}
其他的
{
Console.WriteLine(“这不是一个数字。”);//或任何您想要的消息
}
要缩短此代码,您可以尝试编写如下内容:

    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(“插入年龄:”);
if(true==int.TryParse(Console.ReadLine())
{
控制台写入线(年龄<18岁?
“哎呀!看起来你只是”+年龄+
“岁!您太年轻,无法保存输入。”:
“您的输入已保存。您是“+年龄+”岁。”);
}
其他的
{
Console.WriteLine(“这不是一个数字。”);//或任何您想要的消息
}
如果您想变得更短,请尝试:

    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.");
Console.Write(“插入年龄:”);
Console.WriteLine(int.TryParse(Console.ReadLine())?
(年龄<18岁?
“哎哟!看起来你只有”+岁
+“年!您太年轻,无法保存输入。”
:“您的输入已保存。您是“+年龄+”岁。”)
:“这不是一个数字。”);

尝试Console.ReadLine而不是.Read。Read读取字符,而不是字符串,当您将字符转换为int时,您将获得其代码点值,至少对于这些字符是这样。0是代码点48,1是49,依此类推。作为初学者,您首先应该了解的是转换看起来很简单,但却是导致许多问题的原因。无论何时使用
Convert
,或插入演员阵容等,您都应该确保自己对为什么要这样做有坚定的理解。太多的初学者在没有尝试理解的情况下对无法编译的代码(或只是到处插入
.ToString()
,这是等效的)进行转换。在转换之前将
控制台.Read()的结果存储到变量中会使问题更容易看到。变量将只包含一个字符。当您不了解某个方法在做什么时,您应该做的第一件事是。可能的重复只是为了对此答案进行澄清,只使用
2
,因为它一次只读取一个字符。
Read()
方法已经返回一个整数,因此不需要进行转换。另一方面,
ReadLine()
方法返回一个字符串,因此需要将该值转换为整数。