如果我想获得在C一个字符输入,我怎么会检查,看看是否额外的字符被送到,如果是的话,我会如何清除?
有没有这就像GETC(标准输入)的功能,但不提示用户输入一个字符,这样我就可以把while(getc(stdin)!=EOF);
? 或功能偷看在缓冲区中的下一个字符,如果它不返回NULL(或任何会在那里),我可以打电话(另)一个函数,它刷新标准输入?
编辑
所以,现在,scanf函数似乎做的伎俩,但有没有办法得到它读取字符串,直到换行? 而不是最近的空白? 我知道我可以只是把“%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”)。 如果不是其中的一个,该程序需要发送和错误信息,并回送闯闯。
的问题是,除了字符i输入被的getchar()返回时,“Enter”键的键击(它发送键击到程序)被保存在输入缓冲器中。 该(非印刷)新行字符,然后通过在误差校正回路的的getchar()设施返回,在第二错误消息进一步所得的(因为新行字符不是任一“1”,A“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()
函数,它把你所需要的。
你为什么不使用scanf函数,而不是GETC,利用scanf函数u能得到整个字符串。