繁体   English   中英

如何清除scanf读取的内容?

[英]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库实现了fpurgefabort调用,它们执行相同的操作,但这些调用也不是标准的。)另请注意,刷新stdio输入缓冲区不一定足够:未读的字符也可以在其他情况下累积, OS级输入缓冲区。 如果你试图主动放弃输入(可能是因为预期会发出意外的提示来确认破坏性行为,而意外打字的“y”可能是灾难性的), 你将不得不使用系统特定的技术来检测输入超前输入的存在; 见问题19.119.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM