Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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 退格可以';无法在linux终端中检测到,K&;R 1.10锻炼_C_Linux_Konsole - Fatal编程技术网

C 退格可以';无法在linux终端中检测到,K&;R 1.10锻炼

C 退格可以';无法在linux终端中检测到,K&;R 1.10锻炼,c,linux,konsole,C,Linux,Konsole,我试着做k&r的Exeize 1.10,所以这是: /* * Exercise 1.10 * * Write a program to copy its input to its output, replacing each tab * by \t, each backspace by \b, and each backslash by \\. This makes tab * and backspaces visible in an unambiguous way. * *

我试着做k&r的Exeize 1.10,所以这是:

/* 
 * Exercise 1.10
 *
 * Write a program to copy its input to its output, replacing each tab 
 * by \t, each backspace by \b, and each backslash by \\. This makes tab 
 * and backspaces visible in an unambiguous way.
 *
 */
#include <stdio.h>

int main()
{
    int c;

    while ((c = getchar()) != EOF) {
        if (c == '\t')
            printf("\\t");
        else if (c == '\b')
            printf("\\b");
        else if (c == '\\')
            printf("\\\\");
        else
            printf("%c", c);
    }
}
/*
*练习1.10
*
*编写一个程序,将输入复制到输出,替换每个选项卡
*按\t,每个反斜杠按\b,每个反斜杠按\\。这是我的账单
*以及清晰可见的退格。
*
*/
#包括
int main()
{
INTC;
而((c=getchar())!=EOF){
如果(c=='\t')
printf(“\\t”);
else如果(c=='\b')
printf(“\\b”);
else if(c=='\\')
printf(“\\\”);
其他的
printf(“%c”,c);
}
}
如果我使用
gcc-std=C991.10.c-o测试编译此代码
如果我使用退格,它不会打印
\b
。为什么?在Linux中,我如何尝试按Backspace键获取
\b

有个人对我说:

你的程序可能没有看到那个退格。默认情况下,端子按行缓冲。斯丁也是。stdin的缓冲是IDB


您的代码不起作用,因为它打算在非常旧的UNIX机器上运行。在现代终端上,不会考虑退格字符。

您的代码不起作用,因为它打算在非常旧的UNIX机器上运行。在现代终端上,不会考虑退格字符。

\include
#include <termios.h>
#include <unistd.h>

int mygetch(void)
{


 struct termios oldt,
    newt;
    int ch;
    tcgetattr( STDIN_FILENO, &oldt );
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
    return ch;
}
#包括 int mygetch(无效) { 结构termios oldt, 蝾螈; int-ch; tcgetattr(标准文件号和旧文件号); newt=oldt; newt.c|lflag&=~(ICANON | ECHO); tcsetattr(标准文件号、TCSANOW和NETT); ch=getchar(); tcsetattr(标准文件号、TCSANOW和oldt); 返回ch; }
使用getch然后使用它获取用于backsape的ASCII,不需要输入或清除输入缓冲区,它返回一个int。 享受

#包括
#包括
int mygetch(无效)
{
结构termios oldt,
蝾螈;
int-ch;
tcgetattr(标准文件号和旧文件号);
newt=oldt;
newt.c|lflag&=~(ICANON | ECHO);
tcsetattr(标准文件号、TCSANOW和NETT);
ch=getchar();
tcsetattr(标准文件号、TCSANOW和oldt);
返回ch;
}
使用getch然后使用它获取用于backsape的ASCII,不需要输入或清除输入缓冲区,它返回一个int。
享受

通常,控制台解释特殊字符,如backspace或Ctrl-d。您可以指示控制台不要使用

在运行程序之前,您可以将tty设置为使用忽略退格模式

stty erase ''
然后用

stty sane
这会将退格字符Ctrl-h原封不动地传递给正在运行的程序


如果这没有显示任何差异,那么backspace键可能映射到DEL而不是Ctrl-h

在这种情况下,您只需启动程序,并在使用backspace键的任何位置键入Ctrl-h。但是,如果您想抓住退格键,还必须检查
DEL
,这是


通常,控制台解释特殊字符,如backspace或Ctrl-d。您可以指示控制台不要使用

在运行程序之前,您可以将tty设置为使用忽略退格模式

stty erase ''
然后用

stty sane
这会将退格字符Ctrl-h原封不动地传递给正在运行的程序


如果这没有显示任何差异,那么backspace键可能映射到DEL而不是Ctrl-h

在这种情况下,您只需启动程序,并在使用backspace键的任何位置键入Ctrl-h。但是,如果您想抓住退格键,还必须检查
DEL
,这是


该练习旨在在非常旧的UNIX机器上工作。我认为从那时起,终端的工作方式发生了变化。您可能需要在
ansi
vt100
终端仿真上执行代码。该练习旨在在非常旧的UNIX机器上工作。我认为从那时起,终端的工作方式发生了变化。您可能需要在
ansi
vt100
终端仿真上执行代码。即使在运行程序之前键入代码,\b也不会打印。然后,退格键不是
Ctrl-h
,而是
DEL
。请查看更新的答案。即使在我运行程序之前键入您的代码,\b也不会打印。然后,您的退格键不是
Ctrl-h
,而是
DEL
。请参见K&R?第16页更新的answer.mm,使其更加复杂??无论如何,谢谢你,也许过一会儿我会理解你的代码:)嗯,对于K&R第16页的代码来说太复杂了??无论如何,谢谢你,也许过一会儿我会理解你的代码:)