开发者

Number Pad [Enter] not \n in C?

I'm working on a small C program for a college assignment and I've noticed a weird bug in my code. I use an iMac with the short keyboard generally, but its battery was flat so i plugged in a standard USB keyboard with number pad.

The weird thing is that if I hit [Enter] on my number pad, it seems to do what the regular [Enter} key does, but the \n I am trying to detect in the stdin function I made to read the keyboard input, doesn't work when I use the number pad's [Enter] key.

Wtf?

Here is my function that reads the user input:

/* 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 <开发者_如何学C 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: The myfgetc and the subsequent *fakeStdIn are part of a way that I can unit test my code and 'inject' items into the stdin stream programatically as someone suggested on this question: How do I write a testing function for another function that uses stdin input?.


What output do you get for this tiny test?

#include <stdio.h>
int main(int argc, char* argv[]) {
    int c;
    while((c=getchar()) != EOF) {
        printf("%d\n", c);
    }
    return 0;
}


Could well be that on Mac, you are getting \r\n, not just \n.


So it turns out that it's a Mac OSX thing. I've spoken to other Mac users and they have the same problem. Never found a fix because one may simply not exist. The problem doesn't occur on Solaris machines and since that's the OS which the code will be run on, I guess it doesn't really matter.

I am going to answer this myself with the answer that its just one of those OSX "quirks" and be done with it.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜