В массив записывается не то число C#
Весь код прикреплен. Суть его в том, что считывается 5тизначное число, и записывается в массив int. При вводе числа 12345 в массив записывается 49, 50, 51, 52, 53. Я уже пробовал дебажить, до записи numstr.ElementAt(i) (пробовал и numstr[i]) в arr[i] все нормально, arr[0] равно нулю, как и положено, numstr.ElementAt(i) равен 1, как вводилось, но после операции в 9 строке в массив записывается 49. Откуда оно взялось? Куда делась единица? Почему так получилось?
Весь код я пишу в VSCode и запускаю через .net (т. е. создаю проект командой dotnet new console и т.д. )
Console.Write("Enter your number: ");
int num = Convert.ToInt32(Console.ReadLine());
int[] arr = {0, 0, 0, 0, 0};
string numstr = num.ToString();
Console.WriteLine(num);
for(int i = 0; i < 5; i++)
{
arr[i] = numstr.ElementAt(i);
}
for(int i = 0; i < 5; i++)
{
Console.Write(arr[i] + " ");
}
Ответы (1 шт):
Проблема в том, что Вы считываете символы из строки numstr, а они преобразуются согласно таблице ASCII — символ '1' имеет код 49, '2' — 50 и т.д.
Я предлагаю при занесении в массив преобразовывать получившийся символ в Int при помощи формулы numstr.ElementAt(i) - '0' — в таком случае от кода текущего символа отнимется '0', или 48, и тогда всё будет передано верно.
Console.Write("Enter your number: ");
int num = Convert.ToInt32(Console.ReadLine());
int[] arr = {0, 0, 0, 0, 0};
string numstr = num.ToString();
Console.WriteLine(num);
for(int i = 0; i < 5; i++)
{
arr[i] = numstr.ElementAt(i) - '0'; // '1' - '0' = 49 - 48 = 1, например
}
for(int i = 0; i < 5; i++)
{
Console.Write(arr[i] + " ");
}
UPD: ещё вариант без подобных ухищрений — int.Parse(numstr.ElementAt(i).ToString()); — он преобразует символ в строку, а затем получившуюся строку преобразует в число. Про Parse и его особенности можете прочесть здесь.
Ещё один вариант — Char.GetNumericValue(numstr.ElementAt(i))