c - 在 C 中使用 "\n"和 "\0"以外的特殊字符

标签 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”等字符的情况下做这些事情,我应该怎么做?

最佳答案

我听到两个不同的问题,您会问“或者这是错误的?”

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

首先,从根本上说,您所问的内容包含在 C 语言规范的第 6.4.4.4 节中,其中涵盖了“C 字符常量”。您可以在多个地方查找正式的 C 语言规范,或者您可以搜索“C 字符常量”以获得更友好的描述等。

具体来说,可以在转义序列中使用一些字母来代表特定值的单个字节;例如,\n 就是其中之一,作为 0x0a(十进制 10)的替代,指定(在 ASCII 中)作为换行符的字节。以下是合法的:

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

转义序列 \0\1 之所以有效,是因为 C 支持使用 \ 后跟数字作为八进制值。因此,这也适用于 \3\35,但不适用于 \9,请注意 \35 的十进制值为 29。(如果您不立即明白为什么会这样,请谷歌“八进制值”。)

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

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

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

其次,您是否应该使用给定的字节值作为文件的节分隔符完全取决于您的程序将如何使用。正如其他人在评论中指出的那样,对于此类事情要使用哪种字节值,存在普遍的普遍做法。

我个人同意 0x1e 可能是最有意义的,因为在 ASCII 中它是“记录分隔符”。如果数据需要被其他程序理解,或者您的程序是否需要被其他人理解,那么符合 ASCII 可能很重要。

另一方面,一个简单的代码注释可以让阅读您代码的任何人清楚地知道您使用什么字节值来分隔数据文件的各个部分,并且任何需要理解您的数据文件的程序都需要“知道”关于文件格式的更多信息而不仅仅是记录分隔符是什么。 0x1e 没有什么神奇之处:它只是一个约定,是 ASCII 表上的一个保留位置,以满足常见需求——即,记录可以包含普通文本分隔符(如空格)的文本分隔符、换行符和空值。

一般来说,任何不会出现在您的部分内容中的字节值都可以成为一个很好的部分分隔符。由于您说这些内容将是文本,所以有超过 100 种选择,即使您排除了 \0 (0x00) 和 \n ( 0x0a)。在 ASCII 中,为此类目的预留了一些字节值,因此有助于将选择从几十个减少到几个。即使在这几种中,也只有少数几种是常用的分隔符。

关于c - 在 C 中使用 "\n"和 "\0"以外的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56978586/

相关文章:

c - fopen 导致段错误

java - JProgresbar 不适用于 Files.copy

c++ - 测试文件是否具有所需权限的好方法是什么?

python - 使用 Python 读取 UTF8 CSV 文件

php - 将 PHP 默认编码设置为 UTF-8

c - C 编程中指针字符串不接受输入

c - 全局变量是否比 C 中的局部变量快?

C++ 解析为自定义语言解释器

C# Encoding.Convert 与 C++ MultiByteToWideChar

c - 结构体中数组的内存分配