在C语言中使用“ \ n”和“ \ 0”以外的特殊字符

时间:2019-07-10 21:02:03

标签: c file character-encoding ascii special-characters

我有一个问题。 我在UNIX上用C编写一些代码。 我需要在文件中写一个特殊字符,因为我需要将文件分成小段。

示例:

'SPECIAL_CHARACTER'
section 1 with some text
'SPECIAL_CHARACTER'
section 2 with some text

等等。

我当时正在考虑使用字符'\ 1',这似乎可行,但是可以吗?还是错了?

要执行这些操作而不使用“ \ 0”或“ \ n”之类的字符,我应该怎么做?

1 个答案:

答案 0 :(得分:2)

我听到两个不同的问题,您问“还是错了?”

我听到你问“如何在我的代码中指定一个分隔符字节?”,并且我听到你在问“分隔符字节是什么好的选择?”

首先,从根本上说,您要问的是C语言规范的6.4.4.4节,其中涵盖了“ C字符常量”。您可以在很多地方查找正式的C语言规范,也可以搜索“ C字符常量”以获得更友好的描述,等等。

详细来说,可以在转义序列中使用少数几个字母来表示特定值的单个字节。例如,\n是其中之一,作为0x0a(十进制)的替代,字节(以ASCII表示)被指定为换行符。这是合法的:

\a \b \f \n \r \t \v

逸出序列\0\1起作用是因为C支持使用\,后跟数字作为八进制值。因此,也可以使用\3\35,但不能使用\9,请注意\35的十进制值为29。(Google的“八进制”值”(如果您没有立即看到原因)。

还有其他合法的转义序列:

\' \" \\ \?    :   '  "  \  and  ?, respectively
\xNNNN...      :   each 'N' can be a hexadecimal digit

当然,转义序列只是C字符常量的一方面。

第二,是否应该使用给定的字节值作为文件的节分隔符,这完全取决于程序的使用方式。正如其他人在评论中指出的那样,对于这种事情使用哪种字节值,存在普遍的实践。

我个人认为0x1e也许最有意义,因为在ASCII中它是“记录分隔符”。是否需要其他程序理解数据或者是否需要其他人理解您的程序符合ASCII。

另一方面,简单的代码注释可以使所有阅读您的代码的人都清楚地知道您要使用哪个字节值来分隔数据文件的各个部分,并且需要了解您的数据文件的任何程序都需要“知道”有关文件格式的更多信息,而不仅仅是记录分隔符。 0x1e并没有什么神奇的地方:它只是一个约定,在ASCII表上有一个保留点可以满足常见需求-也就是说,记录分隔的文本可能包含普通的文本分隔符,例如空格,换行符,并且为空。

广泛地说,任何不会出现在您的节内容中的字节值都将构成一个很好的节分隔符。由于您说这些内容将是文本,因此即使排除了\00x00)和\n0x0a)也有100多种选择。在ASCII中,为这种目的预留了一些字节值,因此有助于将选择范围从几十个减少到几个。即使在这几种中,也只有少数几种通常用作分隔符。