如何清除scanf读取的内容?

如何清除scanf读取的内容?,c,linux,stdin,signals,C,Linux,Stdin,Signals,我希望能够清除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_handl

我希望能够清除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 <-
Insert a value: 
5
Insert a value: 
5(no enter was pressed)!
[JPS@localhost c]$ <- NO MORE NR 5! :D
如果可以,如何清除5

我一直在读关于终端设置、FFlush、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(dont press enter)[JPS@localhost c]$ 5 <-
Insert a value: 
5
Insert a value: 
5(no enter was pressed)!
[JPS@localhost c]$ <- NO MORE NR 5! :D

请参阅以下链接以获得好的答案:

引用最有趣的一句话:

没有从stdio中丢弃未读字符的标准方法 输入流。一些供应商确实实现了fflush,因此fflushstdin 丢弃未读字符,尽管可移植程序不能依赖 在这个问题上。某些版本的stdio库实现fpurge或 fabort的电话也有同样的功能但这些不是标准的, 任何一个还要注意的是,刷新stdio输入缓冲区不是必需的 必须足够:未读字符也可以在 其他,操作系统级输入缓冲区。如果你想主动放弃 输入可能是为了预期会向 确认一个破坏性操作,为此意外键入``y 可能是灾难性的,您必须使用特定于系统的技术 检测输入是否存在;见问题和 . 请记住,如果您放弃碰巧键入得太快的输入,用户可能会感到沮丧


请参阅以下链接以获得好的答案:

引用最有趣的一句话:

没有从stdio中丢弃未读字符的标准方法 输入流。一些供应商确实实现了fflush,因此fflushstdin 丢弃未读字符,尽管可移植程序不能依赖 在这个问题上。某些版本的stdio库实现fpurge或 fabort的电话也有同样的功能但这些不是标准的, 任何一个还要注意的是,刷新stdio输入缓冲区不是必需的 必须足够:未读字符也可以在 其他,操作系统级输入缓冲区。如果你想主动放弃 输入可能是为了预期会向 确认一个破坏性操作,为此意外键入``y 可能是灾难性的,您必须使用特定于系统的技术 检测输入是否存在;见问题和 . 请记住,如果您放弃碰巧键入得太快的输入,用户可能会感到沮丧

你可以用图书馆。但我不太明白你说的“清除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-gtestrl.c-otestrl-lreadline编译上述代码

另请参见

您可以使用该库。但我不太明白你说的“清除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-gtestrl.c-otestrl-lreadline编译上述代码


另请参见

好问题。我删除了我的答案,因为没用。尝试生吃;也不起作用。也许依赖于外壳?好问题。我删除了我的答案,因为没用。尝试生吃;也不起作用。可能依赖于shell?我所说的清除5是指程序运行完成后,因为他收到了信号,我不想读取5,也不想在终端中读取5,因为即使程序完成后,他仍留在那里。关键是TTY和伪终端在Linux上是复杂的野兽,为了总结和简化,部分行缓冲是由内核完成的。正如我在其他答案中告诉你的,你真的应该使用像readline或ncurses这样的库。如果你想清除5,scanf对你来说是不够的。我读过关于readline的文章,但我不明白。我需要进口什么?你能给我一个简单的例子吗?我给了一个例子,但我没有费心去测试它。这可能行不通!我得到以下信息:致命错误:readline.h:没有终止此类文件或目录编译。我需要在我的机器上安装吗?我所说的清除5是指程序运行完成后,因为他收到了信号,我不想读取5,也不想让5在终端中,因为即使在程序完成后,他仍然留在那里。重点是TTY和伪终端在Linux上是复杂的野兽,为了总结和简化,部分行缓冲是由内核完成的。正如我在其他答案中告诉你的,你真的应该使用像readline或ncurses这样的库。如果你想清除5,scanf对你来说是不够的。我读过关于readline的文章,但我不明白。我需要进口什么?你能给我一个简单的例子吗?我给了一个例子,但我没有费心去测试它。这可能行不通!我得到以下信息:致命错误:readline.h:没有终止此类文件或目录编译。我需要把它安装在我的机器上吗?所以,没有办法解决这个问题?你的意思是我可以试着寻找
fedora的解决方案,但在ubuntu中不起作用?不适用于特定于系统的解决方案,例如,它们意味着它可能在Linux上工作,但在Windows或OS X上不起作用。试试fpurge,它应该适用于任何Linux。不,最新的Linux发行版也会起作用。但是,它在MacOSX或FreeBSDSo上可能不会起同样的作用,没有办法解决这个问题吗?对于特定于系统的,你的意思是我可以尝试为fedora寻找解决方案,但在ubuntu中不起作用?不,对于特定于系统的,他们的意思是,例如,它可能在Linux上工作,但在Windows或OS X上不起作用。试试fpurge,它应该适用于任何Linux。不,最新的Linux发行版也会起作用。但是,在MacOSX或FreeBSD上可能不会有同样的效果