如何存储字符'\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.out 您必须使用special key combination in vim to enter control characters,例如退格键。在您的情况下,您应该输入ctrl + 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() 将立即拾取诸如 TabCtrl + H 按键之类的击键,字面意思。

要恢复默认终端行为,请使用stty icanonstty 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 的自签名证书并使其被浏览器接受

在 fabric.js 中没有默认选择的画线

是否可以将共享文本作为查询字符串添加到 LinkedIn 共享 URL 并使其与 LinkedIn 移动应用程序一起使用?

学习 《UNIX网络编程》

如何阻止 NetBeans 使用 Cygwin bin 目录并使其使用 MSYS?

如何使用 ms-access-2016 开发应用程序并使其与以前的版本兼容 (2007)