如何清除scanf读取的内容?
我希望能够清除scanf读取的内容的值。换句话说,我想删除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
#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上可能不会有同样的效果