2

假设您在 ISO 646 的不变集中编写(可移植的)C99 代码。这意味着\(反斜杠,反斜线,无论您如何命名)不能直接编写。例如,可以选择这样编写一个 Hello World 程序:

%:include <stdio.h>
%:include <stdlib.h>

int main()
<%
    fputs("Hello World!??/n", stdout);
    return EXIT_SUCCESS;
%>

然而,除了二合字母之外,我还使用??/三合字母来写\字符。

鉴于我上面的假设,是否有可能

  1. 在不使用三元组的情况下在字符串中包含字符(在函数中'\n'转换为换行符) ,或<stdio.h>
  2. FILE *在不使用字符的情况下向 a 写入换行符'\n'
4

5 回答 5

4

因为stdout您可以只使用puts("")输出换行符。或者确实将fputs原始程序中的替换为puts并删除\n.

如果您想将换行符放入一个变量中以便您可以用它做其他事情,我知道另一个标准函数可以免费为您提供一个:

int gimme_a_newline(void)
{
  time_t t = time(0);
  return strchr(ctime(&t), 0)[-1];
}

然后你可以说

fprintf(stderr, "Hello, world!%c", gimme_a_newline());

(我希望我使用的所有字符都是 ISO646 或有向图可访问的。我发现很难获得一个简单的列表,其中列出了 ISO646 中不包含的 ASCII 字符。维基百科有一个颜色编码表,颜色之间的对比度不够我告诉你是什么。)

于 2015-10-26T16:25:00.903 回答
3

你的前提:

假设您正在使用 ISO 646 的不变集编写(可移植的)C99 代码。这意味着不能直接编写 \(反斜杠,反斜线,无论您如何命名)。

是有问题的。C99 定义了“源”和“执行”字符集,并要求两者都包括反斜杠字符的表示(C99 5.2.1)。对于您所描述的努力,我能想象的唯一原因是尝试生成在机器之间移动时不需要字符集转码的源代码。然而,在这种情况下,选择 ISO 646 作为通用基准是很奇怪的。与使用与 ISO-8859 系列字符集不一致的 ISO 646 变体相比,您更有可能遇到 EBCDIC 机器。(如果您可以假设 ISO 8859,那么反斜杠不会出现问题。)

不过,如果您坚持不使用文字反斜杠字符来编写 C 源代码,那么该字符的三元组就是这样做的方法。这就是发明三字母组的目的。在字符常量和字符串文字中,您不能以可移植的方式替换任何其他东西\n或它的三元组等价物??/n,因为它取决于实现该代码的映射方式。特别是,假设它映射到换行符是不安全的(但是,它包含在 ISO 646 的不变字符中)。

更新:

你具体问是否可以

在不使用三元组的情况下在字符串中包含 '\n' 字符(在函数中转换为换行符),或

不,这是不可能的,因为没有一个'\n'角色。而且,这里似乎有点误解:\n在一个字符或字符串中,字面量代表执行字符集中的一个字符。因此,编译器负责该转换,而不是 stdio 函数。stdio 函数的职责是通过编写旨在产生指定效果的字符或字符序列来处理输出中的该字符(“[m] 将活动位置移动到下一行的初始位置”)。

您还问是否可以

将换行符写入 FILE * 而不使用 '\n' 字符?

这取决于你的意思。如果你想写一个你知道执行字符集中代码的字符,那么你可以写一个具有该数值的数字常量。特别是,如果您想写入具有编码值的字符0xa(在执行字符集中),那么您可以这样做。例如,您可以

fputc(0xa, my_file);

但这并不一定会产生等同于

fputc('\n', my_file);
于 2015-10-26T16:15:50.997 回答
1

简短的回答是,是的,对于你想做的事情,你必须使用这个三元组。

即使 有一个有向图,它在字符串文字\中也是无用的,因为有向图必须是标记,它们被标记器识别,而三字母是预处理的,因此仍然可以在字符串文字等中使用。

仍然想知道为什么今天有人会以这种方式对源代码进行编码...:o

于 2015-10-26T16:18:10.793 回答
1
  1. 不。\n(或其等效的三元组)是换行符的可移植表示。
  2. 不,您必须以某种方式表示文字换行符,并且\n(或它的三元组等价物)是唯一可移植的表示。

很难找到使用三合字母或二合字母的 C 源代码!一些编译器(例如 GNU gcc)需要命令行选项来启用三元组的使用,并假设它们已被无意使用并在源代码中遇到它们时发出警告。

编辑:我忘了puts(""). 这是一种偷偷摸摸的方法,但仅适用于stdout.

于 2015-10-26T16:26:35.250 回答
0

是的,当然有可能

fputc(0x0A, file);
于 2015-10-26T15:46:27.937 回答