如何存储字符'\b'并使其被c程序文件识别
How to store the character '\b' and make it be recognized by the file of c program
在看《C程序设计语言》做习题1-10的时候,有个问题让我百思不得其解。
据说当我输入退格键时,字符是由控制台驱动程序处理的,并没有传递给程序,所以我只能做一个嵌入的文件backspace.However,这似乎没有用不管我直接输入'\b'或者按Ctrl + H.
当我按Ctrl + H时,屏幕会显示“\b”,但是当我运行程序时,程序好像还是会看到它作为两个字符 '\' 和 'b'。无论我输入什么,当我 运行 程序时它都不会显示“\backspace”。
如何让程序识别为退格字符?
我的代码如下:
#include <stdio.h>
int main()
{
int c;
while((c=getchar())!=EOF){
if(c=='\t')
printf("\t");
else if(c=='\')
printf("\\");
else if(c=='\b')
printf("\backspace");
else
putchar(c);
}
}
Backspace
是 ASCII 代码 8.
因此您可以在读取文件时检查 c == 0x08
。
else if(c == 0x08)
printf("\backspace");
您可能需要查看 this。
我认为问题不在于您的代码,而在于您在文本编辑器中编写退格字符的方式。
您必须使用 special key combination in vim to enter control characters,例如退格键。在你的情况下,你应该键入 ctrl + v 然后是 ctrl + h 。这应该会产生一个真正的退格字符。
要查看您是否产生了实际的退格字符,您可以使用 hexdump
:
$ hexdump myfile
00000000 68 65 6c 6c 6f 20 08 77 6f 72 6c 64 |hello .world|
^^
注意 08
,这是退格字符(在 C 中,表示为 \b
)。
产生退格字符的另一种方法是通过 C:
中的程序简单地编写它
#include <stdio.h>
int main(void) {
FILE *f = fopen("myfile", "w");
fputs("hello \bworld", f);
fclose(f);
return 0;
}
问题不在你的程序中,而是如你所说,在你的终端驱动程序中。正如您的程序所观察到的那样,奇怪的行为是 Unix 终端模型的结果。
请注意,在您按下 Tab 之后,您可能还必须在程序看到 Tab 之前按下 Enter 作为 \t
字符。这意味着您的终端处于 "cooked" 模式(即,不是原始模式)。同样,终端驱动程序将在您的程序 getchar()
有机会看到它之前处理 Ctrl + H。
您可以做的是 运行 stty -icanon
在启动您的程序之前。 (或者,您可以在程序的初始化例程中 do it programmatically。)然后,诸如 Tab 和 Ctrl + H 按键的按键将被立即被 getchar()
拾起,字面意思。
要恢复默认终端行为,请使用 stty icanon
或 stty sane
。
在看《C程序设计语言》做习题1-10的时候,有个问题让我百思不得其解。
据说当我输入退格键时,字符是由控制台驱动程序处理的,并没有传递给程序,所以我只能做一个嵌入的文件backspace.However,这似乎没有用不管我直接输入'\b'或者按Ctrl + H.
当我按Ctrl + H时,屏幕会显示“\b”,但是当我运行程序时,程序好像还是会看到它作为两个字符 '\' 和 'b'。无论我输入什么,当我 运行 程序时它都不会显示“\backspace”。
如何让程序识别为退格字符?
我的代码如下:
#include <stdio.h>
int main()
{
int c;
while((c=getchar())!=EOF){
if(c=='\t')
printf("\t");
else if(c=='\')
printf("\\");
else if(c=='\b')
printf("\backspace");
else
putchar(c);
}
}
Backspace
是 ASCII 代码 8.
因此您可以在读取文件时检查 c == 0x08
。
else if(c == 0x08)
printf("\backspace");
您可能需要查看 this。
我认为问题不在于您的代码,而在于您在文本编辑器中编写退格字符的方式。
您必须使用 special key combination in vim to enter control characters,例如退格键。在你的情况下,你应该键入 ctrl + v 然后是 ctrl + h 。这应该会产生一个真正的退格字符。
要查看您是否产生了实际的退格字符,您可以使用 hexdump
:
$ hexdump myfile
00000000 68 65 6c 6c 6f 20 08 77 6f 72 6c 64 |hello .world|
^^
注意 08
,这是退格字符(在 C 中,表示为 \b
)。
产生退格字符的另一种方法是通过 C:
中的程序简单地编写它#include <stdio.h>
int main(void) {
FILE *f = fopen("myfile", "w");
fputs("hello \bworld", f);
fclose(f);
return 0;
}
问题不在你的程序中,而是如你所说,在你的终端驱动程序中。正如您的程序所观察到的那样,奇怪的行为是 Unix 终端模型的结果。
请注意,在您按下 Tab 之后,您可能还必须在程序看到 Tab 之前按下 Enter 作为 \t
字符。这意味着您的终端处于 "cooked" 模式(即,不是原始模式)。同样,终端驱动程序将在您的程序 getchar()
有机会看到它之前处理 Ctrl + H。
您可以做的是 运行 stty -icanon
在启动您的程序之前。 (或者,您可以在程序的初始化例程中 do it programmatically。)然后,诸如 Tab 和 Ctrl + H 按键的按键将被立即被 getchar()
拾起,字面意思。
要恢复默认终端行为,请使用 stty icanon
或 stty sane
。