6

我读到 \n 由 CR 和 LF 组成。每个都有自己的 ASCII 码。

那么 C 中的 \n 是由单个字符表示还是由多个字符表示?

编辑:请指定您的答案,而不是简单地说“是的,它是”“不,它不是”

4

9 回答 9

20

在 C 程序中,它是一个字符,'\n'表示行尾。但是,一些操作系统(最显着的 Microsoft Windows)使用两个字符来表示文本文件中的行尾,这很可能是混淆的来源。

CI/O 函数负责在 C 表示'\n'和操作系统使用的任何内容之间进行转换。

在 C 程序中,只需使用'\n'. 保证是正确的。使用某种编辑器查看文本文件时,您可能会看到两个字符。当一个文本文件从 Windows 传输到一些基于 Unix 的系统时,你可能会"^M"出现在每一行的末尾,这很烦人,但与 C 无关。

于 2010-09-08T20:26:13.863 回答
8

一般:'\n'是单个字符,代表换行符。'\r'是单个字符,表示回车。它们是它们自己独立的 ASCII 字符。

出现问题是因为在实际的文件表示中,基于 UNIX 的系统倾向于'\n'单独使用键盘上的“回车”或“回车”来表示您的想法,而 Windows 使用 a'\r'后跟一个'\n'.

在一个文件中:

"This is my UNIX file\nwhich spans two lines"
"This is my Windows file\r\nwhich spans two lines"

当然,像所有二进制数据一样,这些字符都是关于解释的,而解释取决于使用数据的应用程序。在制作 C-strings 时坚持使用 '\n',除非您想要文字回车,因为正如人们在评论中指出的那样,操作系统表示与您无关。IO 库,包括 C 语言,应该自己处理这个并将它从你那里抽象出来。

出于好奇,十进制'\n'的 ASCII 是 10,'\r'是 13,但请注意,这是 ASCII 标准,而不是 C 标准。

于 2010-09-08T20:08:27.460 回答
6

这取决于:

  • '\n'是单个字符(ASCII LF)
  • "\n"是一个'\n'字符,后跟一个 0 终止符

某些 I/O 操作将 a'\n'转换为'\r\n'某些系统 (CR-LF)。

于 2010-09-08T20:08:57.763 回答
4

当您\n使用 windows C stdio 库将 打印到文件时,该库将其解释为逻辑换行符,而不是文字字符0x0A。文件的输出将是 Windows 版本的换行符:( 0x0D0A) \r\n

写作

示例代码:

#include <stdio.h>
int main() {
    FILE *f = fopen("foo.txt","w");
    fprintf(f,"foo\nbar");
    return 0;
}

很快cl /EHsc foo.c你就会得到

0x666F6F 0x0D0A 0x626172 (separated for convenience)

在十六进制编辑器下的 foo.txt 中。

请务必注意,如果您以“二进制模式”写入文件,则不会发生这种转换。

阅读

如果您使用相同的工具读取文件,也在 Windows 上,如果您尝试匹配\n.

回读时

#include <stdio.h>
int main() {
    FILE *f = fopen("foo.txt", "r");
    char c;
    while (EOF != fscanf(f, "%c", &c))
        printf("%x-", c);
}

你得到

 66-6f-6f-a-62-61-72-

因此,这应该与您相关的唯一时间是,如果您是

  • 在 mac/unix 和 windows 之间来回移动文件。Unix 在这里不需要真正的解释,因为\n直接0x0A在那些平台上转换。(pre-OSX\n0x0Dmac iirc 上)
  • 将文本放入二进制文件中,请谨慎操作
  • 当你打开文件“w”而不是“wb”时,试图找出为什么你的二进制数据被搞砸了
  • 根据文件的大小估计重要的东西,在 Windows 上,每个换行符都会有一个额外的字节。
于 2010-09-08T20:47:03.690 回答
3

\n是换行符——它是文本文件中将一行与另一行分开的逻辑表示。

给定的平台将具有线之间逻辑分离的一些物理表示。在 Unix 和大多数类似系统上,换行符由换行 (LF) 字符表示(并且由于 Unix 与 C 密切相关,因此在 Unix 上,LF 通常只称为换行符)。在 MacOS 上,它通常由回车 (CR) 表示。在相当多的其他系统上,最突出的是 Windows,它由回车/换行对表示 - 通常按此顺序,尽管偶尔你会看到某些东西使用 LF 后跟 CR(我记得,Clarion 曾经去做)。

理论上,换行符根本不需要对应流中的任何字符。例如,一个系统可以有文本文件,这些文本文件存储为一个长度后跟适当数量的字符。在这种情况下,运行时库需要在文本文件的内部和外部表示之间进行比现在常见的更广泛的翻译,但这就是生活。

于 2010-09-08T20:28:00.157 回答
3

根据 C99 标准(第 5.2.2 节),

\n "将活动位置 [fputc 中的下一个字符将出现的位置] 移动到下一行的初始位置"。

[ \n ] 应产生一个唯一的实现定义的值,该值可以存储在单个 char 对象中。文本文件中的外部表示不必与内部表示相同,并且超出 [C99 标准] 的范围

由于历史原因,大多数 C 实现选择定义\n为 ASCII 换行符 (0x0A)。但是,在许多计算机操作系统上,将活动位置移动到下一行开头的顺序需要两个字符,通常是 0x0D、0x0A。因此,在写入文本文件时,C 实现必须将 0x0A 的内部序列转换为 0x0D、0x0A 的外部序列之一。这是如何完成的超出了 C 标准的范围,但通常,文件 IO 库将对以文本模式打开的任何文件执行转换。

于 2010-09-09T12:09:31.180 回答
2

你的问题是关于文本文件的。

文本文件是一系列行。是以换行符结尾(包括)的字符序列
。 不同的操作系统以不同的方式表示换行符。

在 Unix/Linux/Mac 上,它们通常由单个 LINEFEED 表示
在 Windows 上,它们通常由 CARRIAGE RETURN + LINEFEED 对表示
在旧 Mac 上,它们通常由单个 CARRIAGE RETURN 表示
在其他系统(AS/400 ??)上甚至可能不是代表换行符的特定字符...

无论如何,其中的库代码负责在读取文本文件C时将系统的换行符转换为,并在写入文本文件时进行反向操作。'\n'

因此,无论任何给定系统上的表示形式是什么,当您在 中读取文本文件C,行都将以 . 结尾'\n'

注意:'\n'不一定适用0x0a于所有系统。

于 2010-09-08T20:52:53.020 回答
0

是的。

\n是换行符。十六进制代码为 0x0A。

\r是回车。十六进制代码为 0x0D

于 2010-09-08T20:08:51.110 回答
0

它是单个字符。它代表换行(但不是唯一的代表 -维基百科)。

编辑:当我输入答案时,问题发生了变化。

于 2010-09-08T20:16:10.353 回答