我正在为一项大学任务开发一个小型C程序,我注意到我的代码中有一个奇怪的错误。我一般使用带有短键盘的iMac,但它的电池是扁平的,所以我插上了带数字键盘的标准USB键盘。
奇怪的是,如果我在我的数字键盘上按[Enter],它似乎执行常规[Enter}键的操作,但是\ n我试图在我用来读取键盘输入的stdin函数,当我使用数字键盘的[Enter]键时不起作用。
跆拳道?
这是我的函数,它读取用户输入:
/* 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++;
}
注意:myfgetc
和后续的*fakeStdIn
是我可以单独测试我的代码并以编程方式将项目“注入”stdin流的方式的一部分,正如有人在此问题上建议的那样:{{ 3}}。
答案 0 :(得分:1)
这个小小的测试得到了什么结果?
#include <stdio.h>
int main(int argc, char* argv[]) {
int c;
while((c=getchar()) != EOF) {
printf("%d\n", c);
}
return 0;
}
答案 1 :(得分:0)
很可能在Mac上,你得到\r\n
,而不只是\n
。
答案 2 :(得分:0)
事实证明这是Mac OSX的事情。我和其他Mac用户交谈过,他们遇到了同样的问题。从来没有找到修复,因为可能根本就不存在。在Solaris机器上不会出现这个问题,因为这是运行代码的操作系统,我想这并不重要。
我将自己回答这个答案,即它只是其中一个OSX“怪癖”并且完成了它。