退出“在读取行时执行”循环不起作用

本文关键字:执行 循环 不起作用 读取 退出 | 更新日期: 2023-09-27 18:33:50

我正在尝试学习C#,因为我在这方面的经验很少。我想在Do While循环中设置一个 Console.Readline,这样我就可以将未知数量的值读入数组。它永远不会退出,因此while中的比较不起作用。怎么了?

do
{
    line = Console.Read();
    if (line != null)
        numbers[c++] = line;
    numbers = new int[c+1];
} while (line != null);

退出“在读取行时执行”循环不起作用

首先,我会使用List<int>来保存输入值。这避免了重新调整数组大小的必要性,您可以将列表用作普通数组。

其次,Console.Read 和 Console.ReadLine 之间有很多区别。第一个逐个返回键入的字符的字符代码,按 Enter 将仅返回 Enter 键的字符代码 (13(。要退出循环,您需要按 Ctrl + Z,返回 -1,而不是 null。

List<int> numbers = new List<int>();
int line;
do
{
    line = Console.Read();
    if (line != -1)
        numbers.Add(line);
} while (line != -1);
for(int x = 0; x < numbers.Count(); x++)
   Console.WriteLine(numbers[x]);

但是,这可能不是您真正想要的。如果需要将键入的数字存储为实整数,则需要这样的代码:

List<int> numbers = new List<int>();
string line = Console.ReadLine();
int number;
do
{
    if(int.TryParse(line, out number))
        numbers.Add(number);
} while (!string.IsNullOrWhiteSpace(line = Console.ReadLine()));
for(int x = 0; x < numbers.Count(); x++)
   Console.WriteLine(numbers[x]);

在这个版本中,我在进入循环之前获得行输入,然后继续直到按下 Enter 键。在每个循环中,我都尝试将输入转换为有效的整数。

另请注意使用 TryParse 将字符串转换为整数。如果用户键入类似"abcdef"的内容,则 TryParse 将返回 false 而不会引发异常。

(感谢@Patrick的建议。

如果您使用的是Console.Readline()那么如果您按Ctrl+Z line将被null(如@Patrick所述(。您应该改为检查空字符串:

    do
    {
        line = Console.ReadLine();
        if (line != null)
            numbers[c++] = int.Parse(line); //assigning string to the last element in the array of ints?
            //if you need to parse string to int, use int.Parse() or Convert.ToInt32() 
            //whatever suits your needs
        numbers = new int[c+1];
    } while (!string.IsNullOrEmpty(line));

无论如何,不清楚您尝试使用此代码完成什么,因为您在每次迭代中都会创建新数组。此外,这将不起作用,因为您有一个int数组,但为其分配了一个string值。