3

与えられたプログラムでは:

int main() {
  char *p = "\0777";
  printf("%d %d %d\n",p[0],p[1],p[2]);
  printf("--%c-- --%c-- --%c--\n",p[0],p[1],p[2]);
  return 0;  
}

出力は次のように表示されます。

63 55 0
-?---7-- ----

\ 0(\ 077)の後の最初の2文字を8進数から10進数に変換していることは理解できますが、なぜ2文字なのか、なぜ1、3、またはその他の文字なのかを説明できますか?

この背後にある論理を説明してください。

4

2 に答える 2

5
char *p = "\07777";

ここでは、charへのポインタに割り当てられた文字列リテラルです。

"\07777"

この文字列では、リテラルの8進数エスケープシーケンスが使用されているため、最初の3桁は8進数を表します。8進数エスケープシーケンスのルールは---

8進エスケープシーケンスでは、0から7までの数字のみを使用できます。8進数のエスケープシーケンスは3桁を超えることはできず、8進数ではない最初の文字で終了します。3桁すべてを使用する必要はありませんが、少なくとも1桁を使用する必要があります。たとえば、ASCIIチャートで示されているように、8進表現はASCIIバックスペース文字の場合は\ 10、文字Aの場合は\101です。

したがって、文字列リテラルは次のようにメモリに保存されます

8進数の077としての最初のバイト。これは10進数で63であり、「?」文字で

2番目と3番目のバイトをそれぞれ文字「7」と「7」として

最後に終了文字「\0」があります。

したがって、あなたの答えは、文字列リテラルの1番目、2番目、3番目のバイトです。

詳細については、このWebサイトにアクセスしてください。

http://msdn.microsoft.com/en-us/library/edsza5ck.aspx

于 2012-08-05T11:24:52.053 に答える
4

これは、言語が 8 進数のエスケープ シーケンスを定義する方法にすぎません。

文字定数または文字列リテラルの一部である 8 進エスケープ シーケンスは、 の\後に 1、2、または 3 桁の 8 進数字 ( '0'.. '7') が続きます。

では"\07777"、円記号の後に 3 つの 8 進数 (0、7、7) が続きます。これは、0778 進数または 10 進数の値を持つ文字を表し63ます。ASCII または ASCII から派生したエンコーディングでは、疑問符になり'?'ます。

'?'したがって、リテラルは、「7」、「7」で構成される長さ 3 の文字列を表します。

しかし、あなたの質問にはタイプミスがあるはずです。プログラムを実行すると、次のような出力が得られます。

63 55 55
--?-- --7-- --7--

の宣言をに変更するp

char *p = "\0777";

あなたが説明した出力が得られます。最後----は実際には 2 つのハイフンであり、その後にヌル文字が続き、その後に 2 つのハイフンが続くことに注意してください。Unix ライクなシステムを使用している場合は、プログラムの出力をcat -vまたはでパイプしてみてくださいcat -A

コードを投稿するときは、再入力するのではなく、コピー アンド ペーストすることが非常に重要です。

(そして、上部に がありません#include <stdio.h>。)

于 2012-08-05T09:18:59.490 に答える