【问题标题】:Trouble with \b escape sequence in fprintf statement..?fprintf 语句中的 \b 转义序列有问题..?
【发布时间】:2014-11-25 03:57:35
【问题描述】:

我正在尝试编写一个程序,该程序从文件中读取学生编号(7 位字符串),将前 3 位数字替换为 x,并将结果打印到新文件中。我可以使用 printf 语句(打印到屏幕)来完成我想要做的事情,但是当使用 fprintf 时,新文件中的结果不是我想要的。这是相关的代码行:

studentno=1234567
fprintf(fp2, "%s\b\b\b\b\b\b\bxxx\t", studentno);

printf 语句中,结果是 xxx4567,正如预期的那样。但是,在fprintf 语句中,当我打开新文件时,它会显示 1234567xxx。我真的不知道为什么,因为'\n''\t' 等其他转义序列在fprintf 语句中的工作方式与在printf 语句中的工作方式相同。如果有人能指出我为什么会发生这种情况的正确方向,那就太好了。

【问题讨论】:

  • 怎么样:fprintf(fp2, "xxx%d", studentno % 10000);

标签: c file formatting printf


【解决方案1】:

您在 FILE 类型上使用它。 如果它是一个文件,它将由文本编辑器来做它想要的。如果它确实是另一端的终端,则需要检查它是否正确处理了这些转义字符。

甚至可能不允许在printf 系列函数中使用一些转义字符,但我不确定。在我看来,如果你能一起避免它们会更容易。

无论如何,我建议只重写 printf 或 fprintf 语句来执行此操作:

fprintf(fp2, "xxx%s", studentno + 3);

这将写入 xxx,然后从第 4 个偏移量开始写入 studentno 的字符。更简单,而且肯定会奏效!

【讨论】:

    【解决方案2】:

    不确定“当我打开新文件时”是什么意思。你用编辑器打开它吗?猫?我怀疑 vi newfile 的显示可能与 cat newfile 不同。因为不同的软件(规范标准输出与您的文本编辑器)可能会以不同的方式显示 \b 或根本不显示。

    无论如何,如果您想在屏幕上隐藏 studentno 的前 3 位数字,则使用退格键是一个不好的方法。不可靠和脆弱。黑客可以通过将输出重定向到文件来轻松获取完整号码,并且没有办法阻止它。我同意rowan.G的回答。

    【讨论】:

      【解决方案3】:

      您正在混淆 printf/fprintf 的格式代码和终端代码,它们指示终端执行某些操作。

      此处列出了 f/printf 的允许格式代码,您会注意到 \b 不是其中之一:

      printf format codes references

      发生的情况是,当您在终端上显示您正在创建的字符串时,终端会将 \b 应用于退格并有效地显示您想要的字符串,但是当您将其打印到文件时,它有没有效果。有很多方法可以做你想做的事,但我建议简单地从文件中读取学生编号作为字符串,然后在数组中对其进行操作。

      【讨论】:

        猜你喜欢
        • 2015-08-24
        • 2012-05-09
        • 1970-01-01
        • 2012-07-11
        • 2018-03-10
        • 1970-01-01
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多