Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在VisualStudio调试控制台中生成退格?_C_Visual Studio_Getchar_Putchar - Fatal编程技术网

C 如何在VisualStudio调试控制台中生成退格?

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')

我正在使用VisualStudio2019社区编写一个Windows控制台模式C程序。我希望在输入流中看到的每个退格都在输出中打印为文本字符串
“\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)outputs
Hellu
@Clifford,我希望我已经做了有用的澄清。感谢您的指导,这很有帮助。我想知道我在*尼克斯是否面临着类似的任务,我该如何处理它。是否有一个非标准的C头或库来绕过*nix shell及其行编辑处理?也许GNU Readline就是这样一种资源。我正在研究的问题是“C编程语言(第二版)”中的一个练习。我推测,这个练习的设计者使用的是一个视频终端,因此可以使用标准(ANSI)C.@Edmund,这可能是一个新问题的主题。所以不是一个讨论论坛,避免在评论中出现问题。