'\ 0'是否自然出现在文本文件中?

Min*_*ran 7 c arduino

我今天遇到了一个令人讨厌的错误,其中一个字符串(存储为char [])将在末尾打印为垃圾。假定要打印的字符串(使用arduino打印/写入功能)是正确的(正确包含了\ r和\ n)。但是,最后会打印垃圾。

然后,我分配了一个额外的元素来在“ \ r”和“ \ n”(这是要打印的字符串中的最后两个字符)之后存储一个“ \ 0”。然后,print()正确打印了字符串。似乎使用'\ 0'表示print()函数该字符串已终止(我记得在Kernighan的C语言中阅读过此内容)。

这个错误出现在我的从文本文件读取的代码中。在我设计代码时,我完全没有遇到“ \ 0”。这使我相信'\ 0'在文本编辑器中没有实际使用,仅由打印功能使用。它是否正确?

Ste*_*hen 6

这让我相信 '\0' 在文本编辑器中没有实际用途,仅用于打印功能。这样对吗?

这是错误的。在 C 中,字符串的结尾由字符指定\0。这通常称为空终止符。几乎所有在 C 库中声明的字符串函数都<string.h>使用此条件来检查或查找字符串的结尾。

另一方面,文本文件通常不会包含任何\0字符。因此,当从文件中读取文本时,您必须先空终止字符缓冲区,然后再打印它。


Ark*_*kku 6

C字符串以NUL字节('\0')终止-隐式地将其附加到任何双引号的字符串文字中,并由所有对字符串进行操作的标准库函数用作终止符。由此得出结论,C字符串不能'\0'在其他字符之间包含终止符,因为没有办法知道它是否是字符串的实际结尾。

(当然,您可以使用C语言而不是C字符串来处理字符串-例如,仅添加一个整数来记录字符串的长度将使终结符变得不必要,但是此类字符串无法与期望C字符串的函数完全互操作。 )

通常,“文本文件”不受C标准的约束,并且C程序的用户可能会想到将包含NUL字节的文件作为C程序的输入(对于C程序,它将无法“正确”处理)。上面的原因是否将文件读入C字符串)。但是,NUL字节没有存在于纯文本文件中的正当理由,对于不包含NUL字节(或某些其他控制字符,可能会中断传输)的文本文件,它至少可以被视为事实上的标准。文本通过一些终端或串行协议)。

我会争辩说,对于在纯文本输入上运行的程序,如果输入中包含NUL个字节,则不能保证正确的输出是可以接受的(尽管不是必须的!)限制。但是,无论是否正确处理,程序员都应意识到这种可能性,并且不允许其在程序中引起不确定的行为。像所有用户输入一样,就它可以包含任何内容(例如,它可能是故意故意形成的)而言,应视为“不安全”。