C#中Do-while循环结合Int32.TryParse时else分支未触发的问题求助
解决猜数字程序的输入验证问题
嘿,刚看了你的代码,马上就发现问题所在啦!你的程序里多了一个多余的Console.ReadLine(),它位于if-else分支的外面,这直接导致了输入非数字时的交互逻辑混乱,让你误以为else分支没触发。
问题根源分析
当你输入字母时,Int32.TryParse()会返回false,程序其实确实进入了else分支输出错误提示,但紧接着执行了外面的Console.ReadLine()——这行代码会让程序暂停,等待你再次输入内容(比如按回车),这就会掩盖掉错误提示的显示,让你误以为程序直接跳去了下一轮的输入提示。
修复后的代码
我帮你调整了代码,去掉了多余的Console.ReadLine(),同时优化了字符串拼接的写法(用字符串插值更简洁),还修正了随机数生成的小问题,让代码可读性和功能性都更好:
Random slumpat = new Random(); int speltal = slumpat.Next(1, 21); // 注意:Next的上限是开区间,写21才能生成1-20的完整范围 bool spela = true; do { Console.Write("\n\tGissa på ett tal mellan 1 och 20: "); if (Int32.TryParse(Console.ReadLine(), out int tal)) { if (tal < speltal) { Console.WriteLine($"\tDet inmatade talet {tal} är för litet, försök igen:"); } else if (tal > speltal) { Console.WriteLine($"\tDet inmatade talet {tal} är för stort, försök igen:"); } else { Console.WriteLine("\tGrattis, du gissade rätt!"); Console.ReadLine(); // 这里保留,让用户看完提示再退出 spela = false; } } else { Console.WriteLine("\tDu måste ange en siffra!"); } } while (spela);
额外小说明
原来的slumpat.Next(1, 20)只能生成1到19的数字,因为Random.Next(min, max)的max是开区间,改成slumpat.Next(1, 21)后才能覆盖1到20的完整范围,这也是个容易忽略的小细节哦!
现在你再测试一下,输入字母时应该会正常显示错误提示,不会再出现逻辑混乱的情况啦。
内容的提问来源于stack exchange,提问作者Strand
相关产品推荐
相关产品推荐

