我试图执行k& r的execize 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);
}
}
如果我使用gcc -std=c99 1.10.c -o test
编译此代码
如果我使用 Backspace ,它不会打印\b
。为什么?以及如何在Linux中尝试\b
按 Backspace ?
一个人说过我:
您的程序可能看不到退格。默认情况下,终端按行缓冲。 stdin也是如此。好吧,stdin的缓冲是IDB。
答案 0 :(得分:2)
#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;
}
使用getch然后使用它获取退格的ASCII,无需输入或清理输入缓冲区并返回一个int。 享受
答案 1 :(得分:2)
通常,控制台会解释特殊字符,例如 backspace 或 Ctrl-d 。您可以指示控制台不使用stty
执行此操作。
在运行程序之前,可以使用
将tty设置为忽略退格模式stty erase ''
然后使用
恢复控制台stty sane
这会将退格字符 Ctrl-h 不变地传递给您正在运行的程序。
如果没有显示任何差异,则退格键可能会映射到 DEL 而不是 Ctrl-h 。
在这种情况下,您可以启动程序并在任何使用退格键的位置键入 Ctrl-h 。如果您想要捕获退格键,还必须检查DEL
,ASCII 127
/* ... */
else if (c == '\b' || c == 127)
printf("\\b");
答案 2 :(得分:1)
您的代码无法运行,因为它的目的是在非常旧的UNIX计算机上运行。在现代终端上,退格角色不会被考虑。