Выход из цикла "делать, пока ReadLine" не работает
Я пытаюсь изучать C#, поскольку у меня мало опыта там. Я хотел настроить Console.Readline в Do While
цикл, так что я могу прочитать в неизвестном количестве значений в массив. Это никогда не выходит, поэтому сравнение в while
не работает. Что случилось?
do
{
line = Console.Read();
if (line != null)
numbers[c++] = line;
numbers = new int[c+1];
} while (line != null);
2 ответа
Прежде всего, я бы использовал List<int>
сохранить входные значения. Это исключает необходимость повторного измерения массива, и вы можете использовать список как обычный массив.
Во-вторых, существует большая разница между Console.Read и Console.ReadLine. Первый возвращает один за другим коды символов введенных символов, и нажатие клавиши Enter просто возвращает код символа (13) клавиши Enter. Чтобы выйти из цикла, вам нужно нажать Ctrl + Z, который возвращает -1, а не ноль.
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()
затем line
будет null
если вы нажмете Ctrl+Z
(как упомянуто 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
значение для этого.