假设您在ISO 646不变集中编写(可移植) C99代码。这意味着\ (反斜杠,反solidus,不管你怎么命名)不能直接写。例如,您可以选择这样编写Hello程序:
%:include <stdio.h>
%:include <stdlib.h>
int main()
<%
fputs("Hello World!??/n", stdout);
return EXIT_SUCCESS;
%>但是,除了有向图之外,我还使用??/三角图来编写\字符。
考虑到我上面的假设,你能不能
'\n'字符(在<stdio.h>函数中转换为换行符)包含在字符串中,而不使用三角图,或FILE *字符的情况下向'\n'写入换行符?发布于 2015-10-26 16:15:50
你的前提是:
假设您在ISO 646不变集中编写(可移植) C99代码。这意味着\(反斜杠,反solidus,不管你怎么命名)不能直接写。
是有问题的。C99定义了“源”和“执行”字符集,并要求两者都包括反斜杠字符的表示(C99 5.2.1)。我可以想象像您所描述的那种努力的唯一原因是试图生成不需要在机器之间移动时进行字符集转换的源代码。然而,在这种情况下,选择ISO 646作为共同基准是很奇怪的。您更有可能遇到EBCDIC机器,而不是使用与ISO-8859系列字符集不一致的ISO 646变体。(如果您可以假设ISO 8859,那么反斜杠不会出现问题。)
尽管如此,,如果您坚持编写C源代码而不使用文字反斜杠字符,那么这个字符的三角图就是这样做的。这就是发明三角图的目的。在字符常量和字符串文本中,您不能移植地替换\n或它的三角图等价物??/n,因为它取决于代码的映射方式。特别是,假设它映射到行提要字符(然而,它包含在ISO 646的不变字符中)是不安全的。
更新:
你会特别问是否有可能
将'\n‘字符(在函数中转换为换行符)包含在字符串中,而不使用三角图,或
不,这是不可能的,因为没有一个'\n'字符。此外,这里似乎有一点误解:字符或字符串文本中的\n表示执行字符集中的一个字符。因此,编译器负责该转换,而不是stdio函数。stdio函数的职责是在输出时通过编写一个字符或字符序列来处理该字符,以便产生指定的效果(“将活动位置移动到下一行的初始位置”)。
你还会问是否有可能
在不使用'\n‘字符的情况下向文件*写入换行符?
这个取决于你的意思。如果您想要写一个您知道的执行字符集中代码的字符,那么您可以编写一个具有该数值的数字常量。特别是,如果您想使用编码值0xa (在执行字符集中)编写字符,那么您可以这样做。例如,你可以
fputc(0xa, my_file);但这并不一定会产生相当于
fputc('\n', my_file);发布于 2015-10-26 16:25:00
对于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或有向图。我发现很难得到一个简单的列表,其中的ASCII字符不在ISO646中。维基百科有一个颜色编码表,没有足够的颜色对比,让我知道是什么。)
发布于 2015-10-26 16:26:35
\n (或其三角图等价物)是换行符的可移植表示。\n (或它的等价物)是唯一的可移植表示。这是非常不寻常的发现C源代码,使用三角图或有向图!一些编译器(例如GNU gcc)需要命令行选项才能使用三角图,并假定它们是无意中使用的,并在源代码中遇到它们时发出警告。
编辑:我忘记了puts("")。这是一种鬼鬼祟祟的方法,但只适用于stdout。
https://stackoverflow.com/questions/33349682
复制相似问题