C 如何在VisualStudio调试控制台中生成退格?
我正在使用VisualStudio2019社区编写一个Windows控制台模式C程序。我希望在输入流中看到的每个退格都在输出中打印为文本字符串C 如何在VisualStudio调试控制台中生成退格?,c,visual-studio,getchar,putchar,C,Visual Studio,Getchar,Putchar,我正在使用VisualStudio2019社区编写一个Windows控制台模式C程序。我希望在输入流中看到的每个退格都在输出中打印为文本字符串“\b” 如何捕获控制台的退格信号?如果我按CTRL-H键,它会删除前面的字符,但实际上我需要getchar()来获取相应的值 while ((c = getchar()) != EOF) { if (c == '\t') { printf("\\t"); } else if (c == '\b')
“\b”
如何捕获控制台的退格信号?如果我按CTRL-H键,它会删除前面的字符,但实际上我需要getchar()来获取相应的值
while ((c = getchar()) != EOF) {
if (c == '\t') {
printf("\\t");
}
else if (c == '\b')
printf("\\b");
else if (c == '\\') {
printf("\\\\");
}
else
putchar(c);
Windows控制台对标准输入执行行编辑处理,允许您使用退格、删除、左/右光标和插入/覆盖模式。这些字符和按键不会导致将字符插入到输入流中 您可以使用WinAPI关闭输入处理。例如,下面我已经切换了处理和行输入模式,以便
getchar()
在输入每个字符后返回:
#include <stdio.h>
#include <windows.h>
int main()
{
HANDLE stdin_handle = GetStdHandle(STD_INPUT_HANDLE);
DWORD console_mode = 0 ;
if( GetConsoleMode( stdin_handle, &console_mode) )
{
console_mode = console_mode & ~(ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT) ;
SetConsoleMode( stdin_handle, console_mode ) ;
}
int c = 0 ;
while( (c = getchar()) != EOF )
{
switch( c )
{
case '\t' : printf( "\\t" ); break ;
case '\b' : printf( "\\b" ); break ;
case '\\' : printf( "\\\\" ); break ;
case '\r' : putchar( '\n' ); break ; // Translate ENTER into Newline
default : putchar( c ); break ;
}
}
}
#包括
#包括
int main()
{
句柄标准句柄=GetStdHandle(标准输入句柄);
DWORD控制台模式=0;
if(GetConsoleMode(标准句柄和控制台模式))
{
console_mode=console_mode&~(ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT);
设置控制台模式(标准手柄、控制台模式);
}
int c=0;
而((c=getchar())!=EOF)
{
开关(c)
{
大小写“\t”:printf(“\\t”);中断;
大小写“\b”:printf(“\\b”);中断;
大小写“\\”:printf(“\\\”);break;
大小写“\r”:putchar(“\n”);break;//将ENTER转换为换行符
默认值:putchar(c);break;
}
}
}
但是,它可能会产生不良的副作用,例如导致ENTER被解释为
\r
,并且在输入下一个字符之前按下ENTER键时,getchar()
不会返回。毫无疑问,这是一个解决方案,但我将留给你们去试验。stdin处理和Windows控制台处理之间可能存在冲突,通常使用ReadConsole()
和Win-API控制台I/O函数可能会有所帮助?我有一个使用Win-API和ReadConsole的有效解决方案
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
BOOL readInput(HANDLE hConsoleInput, TCHAR chBuffer, DWORD nNumberOfCharsToRead);
int main(void)
{
DWORD console_mode = 0;
HANDLE stdin_handle;
TCHAR chBuffer = 0;
stdin_handle = GetStdHandle(STD_INPUT_HANDLE);
if (GetConsoleMode(stdin_handle, &console_mode))
{
console_mode = console_mode & ~(ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT);
SetConsoleMode(stdin_handle, console_mode);
}
if (stdin_handle == INVALID_HANDLE_VALUE) {
printf("Error getting the handle to the console.\n");
exit(EXIT_FAILURE);
}
while (readInput(stdin_handle, chBuffer, 1)) {
;
}
CloseHandle(stdin_handle);
return 0;
}
BOOL readInput(HANDLE hConsoleInput, TCHAR chBuffer, DWORD nNumberOfCharsToRead)
{
DWORD dwCount;
BOOL bSuccess;
bSuccess = ReadConsole(hConsoleInput, &chBuffer, nNumberOfCharsToRead, &dwCount, NULL);
if (!bSuccess) {
printf("Error reading from the console.\n");
exit(EXIT_FAILURE);
}
switch (chBuffer)
{
case '\t':
printf("\\t");
break;
case '\b':
printf("\\b");
break;
case '\\':
printf("\\\\");
break;
case '\r':
putchar('\n');
break;
case '\x1a': //EOF
return FALSE;
default:
putchar(chBuffer);
break;
}
return TRUE;
}
#包括
#包括
#包括
BOOL readInput(句柄hConsoleInput、TCHAR chBuffer、DWORD nNumberOfCharsToRead);
内部主(空)
{
DWORD控制台模式=0;
手柄标准手柄;
TCHAR chBuffer=0;
标准输入句柄=GetStdHandle(标准输入句柄);
if(GetConsoleMode(标准句柄和控制台模式))
{
console_mode=console_mode&~(ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT);
设置控制台模式(标准手柄、控制台模式);
}
if(stdin\u handle==无效的\u handle\u值){
printf(“获取控制台句柄时出错。\n”);
退出(退出失败);
}
while(readInput(标准输入句柄,chBuffer,1)){
;
}
闭合手柄(标准手柄);
返回0;
}
BOOL readInput(句柄hConsoleInput、TCHAR chBuffer、DWORD nNumberOfCharsToRead)
{
德沃德伯爵;
成功;
bSuccess=ReadConsole(hConsoleInput,&chBuffer,nNumberOfCharsToRead,&dwCount,NULL);
如果(!b成功){
printf(“从控制台读取时出错。\n”);
退出(退出失败);
}
交换机(chBuffer)
{
案例'\t':
printf(“\\t”);
打破
案例'\b':
printf(“\\b”);
打破
案例“\\”:
printf(“\\\”);
打破
案例'\r':
putchar('\n');
打破
案例'\x1a'://EOF
返回FALSE;
违约:
putchar(chBuffer);
打破
}
返回TRUE;
}
根本不清楚您在问什么“\b”是后台空间chjaracter-要替换什么?Ctrl-H是退格的标准ASCII Ctrl序列,它在Windows cmd和powershell中工作,但退格也是如此。我不知道“VisualStudio调试控制台”指的是什么。实际上,您使用的是VS代码而不是VS吗?它也是Windowscmd
控制台中的8
<代码>printf(“你好%cu”,8)outputsHellu
@Clifford,我希望我已经做了有用的澄清。感谢您的指导,这很有帮助。我想知道我在*尼克斯是否面临着类似的任务,我该如何处理它。是否有一个非标准的C头或库来绕过*nix shell及其行编辑处理?也许GNU Readline就是这样一种资源。我正在研究的问题是“C编程语言(第二版)”中的一个练习。我推测,这个练习的设计者使用的是一个视频终端,因此可以使用标准(ANSI)C.@Edmund,这可能是一个新问题的主题。所以不是一个讨论论坛,避免在评论中出现问题。