那么在C中,\n是由单个字符表示还是多个字符表示?
编辑:请明确您的答案,而不是简单地说“是”或“否”。
在C程序中,'\n'
是代表行尾的一个字符。然而,一些操作系统(尤其是微软的Windows)在文本文件中使用两个字符来表示行尾,这很可能是引起混淆的原因。
C I/O函数的责任是在C表示的'\n'
和操作系统使用的表示之间进行转换。
在C程序中,只需使用'\n'
即可。这是保证正确的。当使用某种编辑器查看文本文件时,您可能会看到两个字符。当从Windows传输文本文件到某些基于Unix的系统时,每行末尾可能会出现"^M"
,这很烦人,但与C无关。
\n
之外的其他东西?这并不是那么令人困惑 :) - Seth'\n'
表示换行符,是一个单独的字符;'\r'
表示回车符,也是一个单独的字符。它们是独立的 ASCII 字符。'\n'
表示换行符,而 Windows 则会使用'\r'
和'\n'
连续使用来表示一个换行符。"This is my UNIX file\nwhich spans two lines"
"This is my Windows file\r\nwhich spans two lines"
'\n'
是10,'\r'
是13,但请注意这是ASCII标准,而不是C语言标准。\n
的使用位置和方式很重要;对于文本模式流,\n
会自动转换为必要的换行符序列(例如在 Windows 上的 \r\n
)。 - jamesdlin这要看情况而定:
'\n'
是一个单独的字符(ASCII LF)"\n"
是一个 '\n'
字符后面跟着一个 0 终止符某些 I/O 操作在某些系统上会将 '\n'
转换为 '\r\n'
(CR-LF)。
\n
打印到文件时,该库会将其解释为逻辑换行符,而不是字面上的字符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
匹配,则“Windows EOL”将被正确解释。
读取文件时
#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-
\n
直接转换为这些平台上的0x0A
。(在OSX之前,\n
是0x0D
在mac上)\n
是换行符——它是文本文件中分隔一行与另一行的逻辑表示。
不同的平台会有一些物理上的换行符表示。在Unix和大多数类似系统上,换行符由换行(LF)字符表示(由于Unix与C密切相关,所以在Unix上,LF通常被称为新行)。在MacOS上,它通常由回车(CR)表示。在许多其他系统上,尤其是Windows中,它由回车/换行对表示——通常是按顺序排列,但偶尔也会看到使用LF后跟CR的情况(据我记得,Clarion曾这样做过)。
从理论上讲,换行符实际上不需要对应流中的任何字符。例如,系统可以将文本文件存储为长度,后跟适当数量的字符。在这种情况下,运行时库需要执行比现在常见的更广泛的文本文件内部和外部表示之间的转换,但生活就是如此。
char
时,'\n'将具有正值——仅此而已。大多数实现确实使用值10,但它们完全可以合法地使用另一个值。 - Jerry Coffin\n
定义为ASCII换行符(0x0A)。然而,在许多计算机操作系统上,将活动位置移动到下一行开头的序列需要两个字符通常为0x0D、0x0A。因此,在写入文本文件时,C实现必须将0x0A的内部序列转换为0x0D、0x0A的外部序列。如何完成这项工作超出了C标准的范围,但通常情况下,文件IO库会对任何以文本模式打开的文件执行此转换。您的问题是关于文本文件的。
文本文件是一系列行的序列。
行是以(包括)换行符结尾的字符序列。
换行符在不同的操作系统中有不同的表示方式。
在 Unix/Linux/Mac 中,它们通常由单个 LINEFEED 表示。
在 Windows 中,它们通常由 CARRIAGE RETURN 和 LINEFEED 一对表示。
在旧版 Mac 上,它们通常由单个 CARRIAGE RETURN 表示。
在其他系统(AS/400 ??)中,甚至可能没有特定的字符表示换行...
无论任何系统上的表示方式如何,C
的库代码负责将系统的换行符转换为 '\n'
读取文本文件时,并在写入文本文件时执行反向操作。
因此,当您在 C
中读取文本文件时,无论任何系统上的表示方式如何,行都将以 '\n'
结尾。
注意:在所有系统中,'\n'
不一定是 0x0a
。
是的,没错。
\n
表示换行。十六进制代码为 0x0A。
\r
表示回车。十六进制代码为 0x0D。