Цифровая клавиатура [Enter] не \ n в C? - PullRequest
4 голосов
/ 23 мая 2011

Я работаю над небольшой программой на Си для школьного задания, и я заметил странную ошибку в моем коде. Обычно я использую iMac с короткой клавиатурой, но его батарея разряжена, поэтому я подключил стандартную клавиатуру USB с цифровой клавиатурой.

Странная вещь в том, что если я нажимаю [Enter] на моей цифровой клавиатуре, кажется делает то же, что и обычная клавиша [Enter}, но \ n я пытаюсь обнаружить в stdin Функция, которую я сделал для чтения ввода с клавиатуры, не работает, когда я использую клавишу [Enter] на цифровой клавиатуре.

Wtf

Вот моя функция, которая читает пользовательский ввод:

/* This is my implementation of a stdin "scanner" function which reads
 * on a per character basis until the the termination signals are found
 * and indescriminately discarding all characters in the input in excess
 * of the supplied (limit) parameter.  Eliminates the problem of 'left-over'
 * characters 'polluting' future stdin reads.
 */
int readStdin(int limit, char *buffer) 
{
   char c;
   int i = 0;
   int read = FALSE;
   while ((c = myfgetc(stdin)) != '\n' && c != '\0') {
      /* if the input string buffer has already reached it maximum
       limit, then abandon any other excess characters. */
      if (i <= limit) {
         *(buffer + i) = c;
         i++;
         read = TRUE;
      }
   }
   /* clear the remaining elements of the input buffer with a null character. */
   for (i = i; i < strlen(buffer); i++) {
      *(buffer + i) = '\0';
   }
   return read;
}

/* This function used to wrap the standard fgetc so that I can inject programmable
 * values into the stream to test my readStdin functions.
 */
int myfgetc (FILE *fin) {
   if (fakeStdIn == NULL || *fakeStdIn == '\0')
      return fgetc (fin);
   return *fakeStdIn++;
}

NB: myfgetc и последующие *fakeStdIn являются частью способа, которым я могу модульно протестировать свой код и «внедрить» элементы в поток stdin программно, как кто-то предложил по этому вопросу: Как мне написать тестовую функцию для другой функции, которая использует ввод stdin? .

Ответы [ 3 ]

1 голос
/ 23 мая 2011

Какой вывод вы получите для этого крошечного теста?

#include <stdio.h>
int main(int argc, char* argv[]) {
    int c;
    while((c=getchar()) != EOF) {
        printf("%d\n", c);
    }
    return 0;
}
0 голосов
/ 24 мая 2011

Получается, что это Mac OSX. Я говорил с другими пользователями Mac, и у них та же проблема. Никогда не нашел исправления, потому что кто-то может просто не существовать. Проблема не возникает на машинах Solaris, и, поскольку это та ОС, на которой будет выполняться код, я думаю, это не имеет большого значения.

Я собираюсь ответить на этот вопрос сам, ответив, что это всего лишь один из тех "OSX" извращений, и покончим с этим.

0 голосов
/ 23 мая 2011

Вполне возможно, что на Mac вы получаете \r\n, а не просто \n.

...