【发布时间】:2014-07-31 18:04:26
【问题描述】:
背景:
在最高版本 9 的 Mac OS 版本中,文本文件的标准表示使用 ASCII CR(回车)字符(十进制值 13)来标记行尾。
Mac OS 10 与早期版本不同,它类似于 UNIX,并使用 ASCII LF(换行)字符(十进制值 10)来标记行尾。
问题是,在 OS X 之前的 Mac OS 版本的 C 和 C++ 编译器中字符常量 '\n' 和 '\r' 的值是什么?
有(至少)两种可能的方法可以采取:
- 将
'\n'视为ASCII LF字符,并在文本流的输出和输入中将其与CR转换(类似于Windows系统上的LF和CR-LF之间的转换);或 - 将
'\n'视为ASCII CR 字符,不需要对输入或输出进行转换。
第二种方法会有一些潜在的问题。一是假设'\n' 是LF 的代码可能会失败。 (无论如何,这样的代码本质上是不可移植的。)另一个是'\r' 仍然需要一个不同的值,并且在基于 ASCII 的系统上,CR 是唯一合理的值。并且 C 标准不允许 '\n' == '\r'(感谢 mafso 找到引用,5.2.2 第 3 段),因此必须将一些 other 值用于 '\r'。
这个C程序在Mac OS下编译执行N,N小于10的输出是什么?
#include <stdio.h>
int main(void) {
printf("'\\n' = %d\n", '\n');
printf("'\\r' = %d\n", '\r');
if ('\n' == '\r') {
printf("Hmm, this could be a problem\n");
}
}
这个问题适用于 C 和 C++。我想两者的答案都是一样的。
答案也可能因一个 C 编译器而异——但我希望编译器实现者能够保持彼此之间的一致性。
为了清楚起见,我不是在问旧版本的 Mac OS 用什么表示法来表示文本文件中的行尾 。我的问题是专门针对 C 或 C++ 源代码中的常量 '\n' 和 '\r' 的值。我知道将'\n'(无论它的值是什么)打印到文本流会导致它被转换为系统的行尾表示(在本例中为ASCII CR);这种行为是 C 标准所要求的。
【问题讨论】:
-
添加了 mac-classic 标签...
-
现在启动我的旧 iMac...我很快就会有答案。 (Mac OS 8.6)
-
Classic Mac 使用
\r作为文本文件中的行分隔符。由于 C I/O 库负责文件系统和内存表示之间的转换,我猜\ns 被序列化为\r。 -
为了解决如何符合标准
'\n'='\r':自 C89…C11 5.2.2 p3 以来似乎没有变化:“这些转义序列中的每一个都应产生唯一的实现定义的值 [… ]”。所以,不,它不符合要求。但是对于'\n'使用 0xd 和'\r'使用 0xa 的字符集呢? -
@HotLicks 在我的记忆中,旧 Mac 使用
'\r'的方式与 UNIX 系统使用'\n'的方式完全相同。从来没有使用过类似 DOS 的组合。微软用户总是用那个额外的字符惹恼我们——mac用户用换行符,unix用户用回车符......
标签: c++ c mac-classic