我正在尝试让一个while循环进行迭代,直到按下一个键,理想情况下是输入。
具体来说,我想要的是让一个值不断更新并对用户可见,直到他按 Enter 为止。
这是我正在使用的基本代码,它不能像我希望的那样工作
while(1){
printf("Press Enter to Continuen");
printf("Value to Update: %fn",value_to_update);
usleep(10000);
system("clear");
while(getchar() != 'n'){
continue;
}
};
谢谢。很高兴澄清我所说的任何内容或回答其他问题。
我不确定如何准确解释我正在寻找什么。我将尝试两种方法:
1)我希望它执行以下代码的作用,除了在用户按回车键时停止:
while(1){
printf("Value to Update: %fn",value_to_update);
usleep(10000);
system("clear");
};
2)我将列举步骤
1) 打印要更新到屏幕的值
2) 等待 N 微秒
3) 用户是否按输入?
3.错误)如果否:清除屏幕,请转到步骤 1
3.真实)如果是:断开循环
我想这比我想象的要难得多。
使用 select
调用工作的示例代码。
它仅适用于换行符,因为内核 TTY 层将一直保持到获得换行符。
因此,对于任何其他字符(例如空格),我们必须发出我在热门评论中提到的ioctl
调用,以将图层置于"原始"模式(相对于默认的"烹饪"模式)。如果需要,请参阅tcgetattr
和tcsetattr
呼叫。
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <time.h>
#include <sys/time.h>
#include <sys/select.h>
int
main(void)
{
int fd;
char buf[10];
int len;
fd_set rdset;
fd = 0;
while (1) {
// this is do whatever until newline is pressed ...
printf(".");
fflush(stdout);
// set up the select mask -- the list of file descriptors we want to
// wait on for read/input data available
FD_ZERO(&rdset);
FD_SET(fd,&rdset);
// set timeout of 1ms
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 1000;
// wait for action on stdin [or loop if timeout]
// the first arg must be: the highest fd number in the mask + 1
len = select(fd + 1,&rdset,NULL,NULL,&tv);
if (len <= 0)
continue;
// we're guaranteed at least one char of input here
len = read(fd,buf,1);
if (len <= 0)
continue;
// wait for newline -- stop program when we get it
if (buf[0] == 'n')
break;
}
printf("n");
return 0;
}
while(getchar() != 'n'){
continue;
它不做你想的那样。
你想打破第一个循环。
If(getchar() == char_which_breaks_the_loop) break;