[英]How can I clear what scanf read?
我希望能够清除scanf读入的值。换句话说,我想删除scanf读入的值。
这是我的示例代码:
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
volatile sig_atomic_t gotsignal;
void handler(){
gotsignal = 1;
}
int main(){
struct sigaction sig;
sig.sa_handler = handler;
sig.sa_flags = 0;
sigemptyset(&sig.sa_mask);
alarm(5);
sigaction(SIGALRM, &sig, NULL);
int value;
while(!gotsignal){
printf("Insert a value: \n");
scanf("%d", &value);
}
}
输出:
Insert a value:
5(dont press enter)[JPS@localhost c]$ 5 <-
是否有可能(如果是的话)清除5?
我一直在阅读终端设置,fflushs,stdin,但我无法弄明白。 有什么帮助吗?
编辑:经过很多尝试后,我想我发现了一些有用的东西。 如果有人有这个问题这对我有用(不确定它是否适用于其他系统和东西,对此有点新):
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <termios.h>
#include <unistd.h>
volatile sig_atomic_t gotsignal;
void handler()
{
gotsignal = 1;
}
int main(){
struct sigaction sig;
sig.sa_handler = handler;
sig.sa_flags = 0;
sigemptyset(&sig.sa_mask);
alarm(5);
sigaction(SIGALRM, &sig, NULL);
int value;
while(!gotsignal){
printf("Insert a value: \n");
scanf("%d", &value);
}
printf("\n");
tcflush(STDOUT_FILENO,TCIOFLUSH); <-important bit!
return 0;
}
输出:
Insert a value:
5
Insert a value:
5(no enter was pressed)!
[JPS@localhost c]$ <- NO MORE NR 5! :D
请参阅以下链接以获得答案:
引用最有趣的:
没有标准方法可以从stdio输入流中丢弃未读字符。 一些供应商确实实现了fflush,因此fflush(stdin)会丢弃未读的字符,尽管便携式程序不能依赖于此。 (某些版本的stdio库实现了fpurge或fabort调用,它们执行相同的操作,但这些调用也不是标准的。)另请注意,刷新stdio输入缓冲区不一定足够:未读的字符也可以在其他情况下累积, OS级输入缓冲区。 如果你试图主动放弃输入(可能是因为预期会发出意外的提示来确认破坏性行为,而意外打字的“y”可能是灾难性的), 你将不得不使用系统特定的技术来检测输入超前输入的存在; 见问题19.1和19.2 。 请记住,如果丢弃输入错误的输入,用户可能会感到沮丧。
您可以使用readline库。 但是我不清楚“清除5”是什么意思。
最简单的例子可能是
// file testrl.c
#include <readline/readline.h>
#include <stdlib.h>
int main ()
{
char bufprompt[20];
char* lin = NULL;
int cnt = 0;
for (;;) {
memset(bufprompt, 0, sizeof(bufprompt));
cnt++;
snprintf(bufprompt, sizeof(bufprompt)-1, "%d: ", cnt);
lin = readline(bufprompt);
if (!lin)
break;
printf("you typed %s\n", lin);
free (lin);
}
return 0;
}
用gcc -Wall -g testrl.c -o testrl -lreadline
编译上面的gcc -Wall -g testrl.c -o testrl -lreadline
另见这个问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.