题
如果我想要收到一个字输入在C,我将如何检查,看看是否额外的人物已发送,如果是这样,我怎么清楚?
是否有一个功能,其作用类似规模介于仓储式超市货架(stdin),但它不会提示用户输入一个字,所以我只能把 while(getc(stdin)!=EOF);
?或功能看看下一个字符的缓冲,如果它不能返回NULL(或什么会在那里),我可以叫一个(闲话)的功能,冲stdin?
编辑
所以现在,scanf似乎是这样做的诀窍,但是有办法得到它读到的 整个 串,直到newline?而不是到最近的空白?我知道我可以把"%s%s%s"或什么的格式串但我可以处理的一个任意数量的空间?
解决方案
可以不刷新的输入流。如果你这样做你会被调用未定义的行为。最好的办法是做:
int main() {
int c = getchar();
while (getchar() != EOF);
return 0;
}
要使用scanf
魔法:
#include <stdio.h>
#include <stdlib.h>
#define str(s) #s
#define xstr(s) str(s)
#define BUFSZ 256
int main() {
char buf[ BUFSZ + 1 ];
int rc = scanf("%" xstr(BUFSZ) "[^\n]%*[^\n]", buf);
if (!feof(stdin)) {
getchar();
}
while (rc == 1) {
printf("Your string is: %s\n", array);
fflush(stdout);
rc = scanf("%" xstr(LENGTH) "[^\n]%*[^\n]", array);
if (!feof(stdin)) {
getchar();
}
}
return 0;
}
其他提示
可以使用getline
读取输入的一整行。
另外(响应你原来的问题),你可以调用标准输入select
或poll
,看是否有要读取其他字符。
我有一个类似的问题今天,我找到了一种方法,似乎工作。我不知道的细节情况,所以我不知道它是否会为你工作或没有。
我正在写一个例行程序,需要得到一个单一的角色的键盘,并需要三个具体键('1','2',或'3').如果不是这些程序需要的发送和错误的消息和循环回对另一个尝试。
问题是,在外来的性格,我正在进入返回形式(),'进入'键击(其发送键的程序)保存在输入缓冲区。那(非印刷)newline字然后返回的形式()设施在错误的校正的循环,导致进一步的第二个错误信息(自newline字不是一个'1','2',也不是一个'3'.)
这个问题进一步复杂,因为有时我会提前获得自己,而不是进入一个单一的角色,我会输入文件,这些选项之一将请求。然后我一整串不需要人物在缓冲区,导致在一个长长的清单的错误信息滚动屏幕上。
不凉爽。
什么似乎已经固定,不过,如下:
c = getchar(); // get first char in line
while(getchar() != '\n') ; // discard rest of buffer
第一行就是一个实际使用的字符,我进入。第二线处置任何残余仍然在输入缓冲区。它只是创造了一个循环,再换一个角色的时间自输入缓冲区。有没有行动规定采取的地方,而该声明是循环。它只需读一字,如果它不是一个新行,以追溯的下一步。当发现有一个空行,循环结束,它会在以下订单的企业中的程序。
我们可以使一个函数来清除键盘缓冲区,如下所示:
#include <stdio.h>
void clear_buffer(){
char b;
//this loop take character by character in the keyboard buffer using
//getchar() function, it stop when the variable "b" was
//enter key or EOF.
while (((b = getchar()) != '\n') && (b != EOF));
}
int main()
{
char input;
//get the input. supposed to be one char!
scanf("%c", &input);
//call the clearing function that clear the buffer of the keyboard
clear_buffer();
printf("%c\n",input); //print out the first character input
// to make sure that our function work fine, we have to get the
// input into the "input" char variable one more time
scanf("%c", &input);
clear_buffer();
printf("%c\n",input);
return 0;
}
使用读这会占用大量的字符(大于1,也许256)的,看看有多少真正返回。如果你不止一个,你知道;如果你只有一个,那就是所有可用。
您不提平台,这得到相当棘手相当迅速。例如,在Unix(Linux)的,正常的机制将返回数据线 - 也许你是后一个字符和一个换行符。或者,也许你说服你的用户键入^ d(默认)发送前面的字符。或者,也许使用控制功能的终端放入原始模式(像例如vi
和emacs
做程序)。
在Windows中,我不敢肯定 - 我认为这是一个getch()
功能,做你所需要的。
你为什么不使用,而不是GETC scanf函数,通过使用scanf函数u能得到整个字符串。