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

1

簡単な答えは、はい、あなたがやりたいことのために、このトライグラフを使わなければなりません。

のダイグラフがあったとしても、ダイグラフはトークンである必要があり、トークナイザーによって認識されるため、文字列リテラル\内では役に立ちませんが、トリグラフは前処理されているため、文字列リテラル内などでも機能します。

なぜ誰かが今日このようにソースをエンコードするのか、まだ疑問に思っています... :o

于 2015-10-26T16:18:10.793 に答える
1
  1. No. \n(またはそれに相当するトライグラフ) は、改行文字の移植可能な表現です。
  2. いいえ、リテラルの改行を何らかの形で表現する必要があり、\n(またはトライグラフに相当する)唯一の移植可能な表現です。

トリグラフまたはダイグラフを使用する C ソース コードを見つけることは非常に珍しいことです。一部のコンパイラ (GNU gcc など) では、トリグラフの使用を有効にするコマンド ライン オプションが必要であり、トリグラフが意図せずに使用されたと想定し、ソース コードでトリグラフが検出された場合に警告を発します。

編集: を忘れていましputs("")た。これは卑劣な方法ですが、stdout.

于 2015-10-26T16:26:35.250 に答える
0

はい、もちろん可能です

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