2017-01-19 1 views
0

Я хочу прочитать 20 предметов, но только 19 читаются через консоль. Любая идея почему?Почему мой цикл for останавливается перед последним индексом?

То, что я хочу, чтобы мой код, чтобы сделать это:

  • первый: читать interger к- от стандартного входного буфера (консоль)
  • второй: прочитать 20 целых чисел в массив int x[]

    static void Main(string[] args) 
    { 
        int k ; 
        int[] x = new int [20]; 
        int[] y = new int [20]; 
        int[] yval = new int[20]; 
        int i; 
    
        Console.WriteLine("Enter k value"); 
        k = Console.Read(); 
    
        Console.WriteLine("Enter x values\n "); 
        for (i = 0; i <=19 ; i+=1) 
        { 
        x[i] = int.Parse(Console.ReadLine()); 
        yval[i] = (x[i] + k) % 26; 
        } 
    } 
    
+13

Я подозреваю, что вы обнаружите, что 20 читаются, но первое не то, что вы ожидаете от этого, из-за использования 'Console.Read()', которое читает один символ. Возможно, вы хотели 'k = int.Parse (Console.ReadLine());' там? (В качестве примечания я настоятельно рекомендую вам объявлять переменные в точке первого использования, а не помещать их в верхнюю часть метода.) –

+0

@JonSkeet Спасибо. Я думаю, что это может быть проблемой. Я только что видел, что К дал странный результат. Я также догадываюсь из того, что вы только что сказали, что 'Console.Read()' влияет на другие строки ... Что касается объявления переменной, это привычка программирования C. Спасибо за совет, хотя (сейчас я начну работать так) –

+0

Возможно, потому что вы говорите «i <= 19»? Я не совсем уверен, у меня обычно были проблемы при этом. – MrStank

ответ

2

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

static void Main(string[] args) 
    { 
     int k; 
     int[] x = new int[20]; 
     int[] y = new int[20]; 
     int[] yval = new int[20]; 
     int i; 

     Console.WriteLine("Enter k value"); 
     k = Console.Read(); 
     Console.WriteLine("k = {0}", k); 

     Console.WriteLine("Enter x values\n "); 
     for (i = 0; i <= 19; i += 1) 
     { 
      var input = Console.ReadLine(); 
      x[i] = int.Parse(input); 
      yval[i] = (x[i] + k) % 26; 

      Console.WriteLine("x[{0}] = {1}", i, x[i]); 
     } 

     Console.WriteLine("Press any key..."); 
     Console.ReadKey(); 
    } 

Если ввести «12» для к, выход выглядит следующим образом:

Enter k value 
12 
k = 49 
Enter x values 

x[0] = 2 

Первый символ '1' сохраняется в k качестве int значения 49 (значение ASCII для '1'). Буфер по-прежнему имеет '2' и новую строку для чтения. Они считываются на первом проходе через цикл и сохраняются в первом элементе массива.

Как сказал Джон, вам, вероятно, понадобится k = int.Parse(Console.ReadLine());.

+0

символ новой строки находится внутри x [0] с 2? –

+0

Нет, новая строка не возвращается. Из документации для [Console.ReadLine()] (https://msdn.microsoft.com/en-us/library/system.console.readline (v = vs.110).aspx), «Строка определяется как последовательность символов, за которой следует возврат каретки (шестнадцатеричный 0x000d), строка (hexadecimal 0x000a) или значение свойства Environment.NewLine. Возвращенная строка не содержит символ завершения (ы) «. – chadnt

Смежные вопросы