Я работаю над небольшой программой на Си для школьного задания, и я заметил странную ошибку в моем коде. Обычно я использую 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? .