我永远不会记得我是怎么做的,因为它对我来说很少见.但是在C或C++中,从标准输入读取字符而不等待换行符的最佳方法是什么(按回车键).
理想情况下,它也不会将输入字符回显到屏幕上.我只想捕捉击键而不影响控制台屏幕.
在控制台应用程序中等待用户输入的最佳方法是什么?
std::cout << "press any key to exit...";
// wait for user to hit enter or another key
Run Code Online (Sandbox Code Playgroud) 我正在尝试用C语言编写一个程序(在Linux上)循环,直到用户按下一个键,但不应该要求按键继续每个循环.
有一个简单的方法吗?我想我可以做到这一点,select()但这似乎很多工作.
或者,有没有办法在程序关闭之前捕获ctrl- ckeypress进行清理而不是非阻塞io?
这些getch和getchar功能之间的确切区别是什么?
我getchar()对以下代码中的角色感到困惑.我的意思是我知道它帮助我看到输出窗口,只有在按下Enter键时才会关闭.
所以getchar()基本上等着我按回车然后再读一个字符.
这个函数读取的单个字符是什么?我没有按键盘上的任何键来阅读.
现在当它没有读任何东西的时候,为什么它没有给出一个错误,说"嘿,你没有输入任何东西供我阅读"?
#include <stdio.h>
int main()
{
printf( "blah \n" );
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我的C代码:
int c;
c = getchar();
while (c != EOF) {
putchar(c);
c = getchar();
}
Run Code Online (Sandbox Code Playgroud)
为什么这个程序在输入方面会这样反应hello?
hello
hello
Run Code Online (Sandbox Code Playgroud)
而不是像:
hheelloo
Run Code Online (Sandbox Code Playgroud) 从我之前的帖子中,我发现getchar()只有在按Enter键时才会完成.我们考虑一下这段代码:
#include<stdio.h>
main()
{
getchar();
getchar();
getchar();
getchar();
getchar();
}
Run Code Online (Sandbox Code Playgroud)
我希望它能像这样运行:我按下某个键1,然后按Enter键,然后按键2键,然后按键3键,然后按键4键,然后按键4键,输入键,最后按键5键,输入,程序应立即终止.这不是实际发生的事情.会发生什么:我按下某个键1然后按Enter键,然后按键2键,输入键,然后按键3键,输入,程序最终终止!
- 为什么最后两个getchar()不起作用?
我观察到的另一个奇怪的事情是,如果我这样做:key1,key2,key3,key4 + Enter然后程序终止.例如,如果我连续按q,w,e和r然后按Enter键,程序将终止.
- 为什么不是所有的getchar()都要求输入?这是否意味着getchar()将任何其他键作为Enter?但接下来的密钥是否作为下一个getchar()的输入?
让我们考虑另一个代码:
#include<stdio.h>
main()
{
int c=getchar();
int d=getchar();
int e=getchar();
printf("2 getchar are remaining\n");
int f=getchar();
int g=getchar();
printf(" c is %d, d is %d, e is %d, f is %d and g is %d",c,d,e,f,g);
}
Run Code Online (Sandbox Code Playgroud)
我输入:ABCDEFG然后输入.当我按下C或D时,应该打印第2行getchar.但它最后打印,意味着所有getchar()s同时执行 - 这很奇怪.
- 程序是否逐行执行?即在第三个getchar之后,printf()应该可以工作.但是当所有的getchar()都被执行时它终于工作了.
我想在我的c程序中读取箭头按键并用其他字符串替换它们(立即在终端本身中).我正在尝试在unix终端中实现bash历史记录功能.我写了这段代码.
int
main(int argc, char *argv[])
{
char c;
char str[1024];
int i = 0;
while((c = fgetc(stdin)) != '\n'){
if(((int)c) == 27){
c=fgetc(stdin);
c=fgetc(stdin);
if (c == 'A')
{
printf("%c[A%c[2K",27, 27);
printf("UP");
}
}
str[i++] = c;
}
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为终端等待换行符或EOF将输入缓冲区发送到stdin.所以,我必须按回车键/返回键来分析用户输入.
在这个答案中,用户提到使用system ("/bin/stty raw");但这取代了所有默认的终端行为(例如退格,删除等).
那么,有没有什么方法可以直接读取/操作终端输入缓冲区并在检测到箭头按键时调整缓冲区本身?
环境 - Ubuntu(Linux)
更新1:是否有更改信号/中断的方法(默认是按输入键),使终端将存储的输入发送到缓冲区?这也可以帮助我实现相同的行为.
最终守则:
我通过检查输出来找到特定按键的ASCII字符 strace bash
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#define ESCAPE '\33'
#define BACKSPACE '\177'
#define …Run Code Online (Sandbox Code Playgroud) 读取时,std::cin即使我只想读取一个字符。它将等待用户插入任意数量的字符并点击Enter继续!
我想逐个字符读取字符,并在用户在终端中键入时为每个字符执行一些说明。
如果我运行这个程序并输入abcd那么Enter结果将是
abcd
abcd
Run Code Online (Sandbox Code Playgroud)
但我希望它是:
aabbccdd
Run Code Online (Sandbox Code Playgroud)
这是代码:
int main(){
char a;
cin >> noskipws >> a;
while(a != '\n'){
cout << a;
cin >> noskipws >> a;
}
}
Run Code Online (Sandbox Code Playgroud)
请问怎么做?
这是我的代码:
#include <stdio.h>
int main()
{
char a = getchar();
printf("char: %c", a);
}
Run Code Online (Sandbox Code Playgroud)
我正在编译这个gcc.
运行时,即使在控制台上输入一个字符后,程序也会等待输入.它不应该立即退出并打印角色吗?我在Ubuntu for Windows上运行它,如果这可以有所作为.
c ×8
getchar ×4
c++ ×3
input ×2
io ×2
linux ×2
asynchronous ×1
char ×1
cin ×1
input-buffer ×1
inputstream ×1
nonblocking ×1
stdin ×1
stdio ×1