如何存储字符'\b'并使其被c程序文件识别
Posted
技术标签:
【中文标题】如何存储字符\'\\b\'并使其被c程序文件识别【英文标题】:How to store the character '\b' and make it be recognized by the file of c program如何存储字符'\b'并使其被c程序文件识别 【发布时间】:2016-04-24 10:00:54 【问题描述】:当我阅读C编程语言并做练习1-10时,有一个问题让我很困惑。
据说当我输入退格时,字符是由控制台驱动处理的,并没有传递给程序,所以我可以做的是创建一个嵌入退格的文件。但是,我直接输入似乎也没用'\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);
【问题讨论】:
"创建文件" 你是如何创建这个文件的? (什么文本编辑器?) 我用vim创建了一个名为b的文件,然后输入命令./a.outctrl + v
,然后输入ctrl + h
。这将输入一个真正的退格字符。
哦,不,不是 Ctrl +h。是其他字母,我忘记了。现在,我找不到了,我知道那些字母是什么。我很抱歉
嗯,我按Ctrl+h,再按Ctrl+v,当我按wq的时候,b写的是print。但是当我键入运行程序的命令时,它仍然无法打印\backspace。似乎程序将其识别为空行并在该行中不打印。
【参考方案1】:
我认为问题不在于您的代码,而在于您在文本编辑器中编写退格字符的方式。
您必须使用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;
【讨论】:
你的回答解决了我的问题,它可以正确打印退格。非常感谢! 那么,你能告诉我在Windows中我应该输入什么键吗? 在源代码中嵌入不可打印的 ASCII 字符,如 ASCII 08,是邪恶的。请改用适当的反斜杠转义序列。 @MaryWee:这取决于您使用的文本编辑器。对于 Windows 上的 Vim,我相信相同的键序列应该可以工作。 @200_success:此源代码中没有嵌入不可打印的字符。【参考方案2】:问题实际上并不在于您的程序,而正如您所说,问题在于您的终端驱动程序。您的程序观察到的奇怪行为是 Unix 终端模型的结果。
请注意,在您按下 Tab 后,您可能还必须按下 Enter,然后程序才能将 Tab 视为 \t
字符.这意味着您的终端处于“熟”模式(即非原始模式)。同样,终端驱动程序将在您的程序的getchar()
有机会看到它之前处理 Ctrl + H。
您可以在启动程序之前运行stty -icanon
。 (或者,您可以在程序的初始化例程中do it programmatically。)然后,getchar()
将立即拾取诸如 Tab 和 Ctrl + H 按键之类的击键,字面意思。
要恢复默认终端行为,请使用stty icanon
或stty sane
。
【讨论】:
我找到了stty的手册页并找到了“stty sane”,但我仍然对如何使用它以及正确的格式感到困惑。抱歉,我是 linux 新手,你能告诉我使用 stty icanon 和 stty sane 时正确的格式命令是什么吗?【参考方案3】:Backspace
是 ASCII 代码 8。
所以你可以在读取文件时检查c == 0x08
。
else if(c == 0x08)
printf("\\backspace");
您可能想查看this。
【讨论】:
嗯,我刚刚看到并理解了那个程序。但是,好像和我的不一样。当我让程序重定向到嵌入“\b”的名为 b 的文件时,我无法将文件中的“\c”识别为一个字符以上是关于如何存储字符'\b'并使其被c程序文件识别的主要内容,如果未能解决你的问题,请参考以下文章
创建用于测试 localhost 的自签名证书并使其被浏览器接受
是否可以将共享文本作为查询字符串添加到 LinkedIn 共享 URL 并使其与 LinkedIn 移动应用程序一起使用?