2014-02-06 3 views
1

Эта программа запрашивает у пользователя размер массива, затем запрашивает у пользователя ввод значений массива. Проблема, с которой я столкнулась, заключается в том, что цикл for для чтения в значениях массива работает неправильно. Независимо от того, что является значением для n, он будет сидеть и спрашивать намного больше входов.Чтение значений в массиве

int n; 

Console.WriteLine("Enter how many values you are entering in"); 
n = Convert.ToInt32(Console.Read()); 

int[] arr = new int[n]; 
Console.WriteLine("Enter your values in"); 

for (int i = 0; i < n; i++) 
{ 
    arr[i] = Convert.ToInt32(Console.Read()); 
} 
+3

Используйте 'Console.ReadLine()' вместо 'Console.Read()' , – MarcinJuraszek

+0

@MarcinJuraszek вы должны запустить код до спекуляции ... – Bogdan

+0

@Bogdan Что заставляет вас думать, что я этого не сделал? – MarcinJuraszek

ответ

3

Быстро и легко исправить:

Использование int.Parse(Console.ReadLine()) вместо вашего Convert.ToInt32(Console.Read())

Пояснение:

Вы получали значение ASCII так, как вы это делали. Например, если вы набрали бы номер 2, то ваша переменная n на самом деле была бы установлена ​​на 50.

+0

@MarcinJuraszek Ум я сказал ReadLine? –

+0

@MarcinJuraszek прочитал мой ответ! Он говорит, что READLINE НЕ ПРОЧИТАЕТ! –

+1

он не читает, он использует readline в ответе –

0

Использование ReadLine(), чтобы получить число, а затем использовать ReadKey() не Read() или ReadLine() при входе в chararcters

int n; 

Console.WriteLine("Enter how many values you are entering in"); 
n = Convert.ToInt32(Console.ReadLine()); 

int[] arr = new int[n]; 
Console.WriteLine("Enter your values in"); 

for (int i = 0; i < n; i++) 
{ 
    char c = Console.ReadKey().KeyChar; 
    arr[i] = Convert.ToInt32(c.ToString()); 
} 
0

Используйте Console.ReadLine() вместо Console.Read().

Как указано в документе here, Console.Read() возвращает только один символ. Вероятно, вы захотите прочитать всю строку и проанализировать ее для целочисленного значения.

Этот код должен делать то, что вы хотите:

int n; 

Console.WriteLine("Enter how many values you are entering in"); 
//n = Convert.ToInt32(Console.Read()); 
n = Int32.Parse(Console.ReadLine()); 

int[] arr = new int[n]; 
Console.WriteLine("Enter your values in"); 

for (int i = 0; i < n; i++) 
{ 
    arr[i] = Int32.Parse(Console.ReadLine()); 
} 

Это работает во входном случае п = 10, а также.

0

вот версия с более надежной проверкой ошибок. Примечания: (ввод это непосредственно без запуска, поэтому я прошу прощения, если есть незначительные ошибки синтаксиса)

 int count; 

     bool attemptedSetCount = false; 
     do 
     { 
      if (attemptedSetCount) 
      { 
       Console.WriteLine("Please enter a valid integer"); 
      } 
      Console.WriteLine("Enter how many values you are entering in"); 
      string countString = Console.ReadLine(); 
      attemptedSetCount = true; 
     } 
     while (!Int32.TryParse(countString, out count)); 

     int[] arr = new int[n]; 
     Console.WriteLine("Enter your values in"); 

     for (int i = 0; i < count; i++) 
     { 

      string valString = (Console.ReadLine()); 
      int val; 
      if(!Int32.TryParse(valString, out val)) 
      { 
       Console.WriteLine("Please enter a valid integer"); 
       i--; 
      } 
      else 
      { 
       arr[i] = val; 
      } 
     } 
0
for (int i = 0; i < n; i++) 
{ 
    string value = Console.ReadLine(); 
    int result; 
    if (int.TryParse(value, out result)) arr[i] = result; 
    else 
    { 
     Console.WriteLine("Invalid value try again."); 
     i--; 
    } 
} 
0

Console.Read функция считывает следующий знак ввода и возвращает его в качестве int значения. Затем код передает его в API Convert.ToInt32, который, по существу, возвращает точное значение, которое было передано. Это означает, что цифры, такие как 1, которые имеют значение символа 49, будут обрабатываться как 49. Вот почему ваш код читается во многих значениях

Для правильного считывания числа из Console используйте метод ReadLine, который возвращает String. Это может затем быть передан Int32.Parse и преобразуется в int

Int32.Parse(Console.ReadLine()); 

Или еще лучше, просто абстрактные это к способу

static int ReadInt() { 
    return Int32.Parse(Console.ReadLine()); 
} 
0

Have you read the documentation?

Метод Read блокирует его возврат при вводе символов ввода; завершается, когда вы нажимаете клавишу Enter. Нажатие Enter добавляет к вашему входу последовательность завершения строки, зависящую от платформы (например, Windows добавляет последовательность возврата строки каретки). Последующие обращения к методу чтения . Извлеките свой ввод по одному символу за раз. После того, как будет получен символ , Read считывает его возврат снова и цикл повторяется.

Обратите внимание, что вы не получите значение свойства -1, если вы не выполните одно из следующих действий : одновременно нажать клавишу клавишу модификатор управления и Z консоли (Ctrl + Z), который сигнализирует конец-of состояние файла; нажмите эквивалентный ключ , который сигнализирует состояние конца файла, например функциональную клавишу F6 в Windows; или перенаправить входной поток на источник, такой как текстовый файл, который имеет фактический символ конца файла .

Метод ReadLine или KeyAvailable свойства и метод ReadKey являются предпочтительно с использованием метода Read.

Если я выполняю этот код:

Console.Write("? ") ; 
int input = Console.Read() ; 
Console.WriteLine("You entered {0}.", input) ; 
Console.WriteLine("{0} is the decimal code point for the character whose glyph is '{1}.'" , input , (char)input) ; 

И, если я, на ? строке введите символы 123 с последующим ключом return:

? 123<return> 

Увидимся этот выход:

You entered 49. 
49 is the decimal code point for the character whose glyph is '1'. 

[Обратите внимание, что в Windows, вы можете сгенерировать «1» в командной строке, удерживая нажатой <ALT> ключ, набрав «0049 and releasing the` ключ.]

Предполагая, что намерение состоит в том, чтобы пользователь, чтобы указать ряд значений, которые будут введены и затем подтолкнуть их к тому, что многие входные значения, вы хотите код, который выглядит примерно так:

static void Main() 
{ 
    int n  = ReadIntegerFromConsole("How many values do you want to enter?") ; 
    int[] values = new int[n] ; 

    for (int i = 0 ; i < values.Length ; ++i) 
    { 
    string prompt = string.Format("{0}/{1}?" , i , n) ; 

    values[i] = ReadIntegerFromConsole(prompt) ; 

    } 

    Console.WriteLine("You entered: {0}" , string.Join(", ",values)) ; 
    return ; 
} 

static int ReadIntegerFromConsole(string prompt) 
{ 
    int value ; 
    bool isValid ; 

    do 
    { 

    Console.Write(prompt) ; 
    Console.Write(' '); 

    string text = Console.ReadLine() ; 

    isValid = int.TryParse(text, out value) ; 

    prompt = "That's not an integer. Try again:" ; 
    } while (!isValid) ; 

    return value ; 
} 
Смежные вопросы