2

memcpy() を使用して作成した文字列があり、(展開すると) 次のようになります。

char* str = "AAAA\x00\x00\x00...\x11\x11\x11\x11\x00\x00...";

文字列のすべての文字を出力したいのですが、文字が null の場合は、"(null)"'\0' の代わりに出力します。

puts() や printf() などの関数を使用すると、最初の null で終了して出力されます

AAAA

では、文字列の末尾として解釈せずに、実際の単語「(null)」を出力するにはどうすればよいでしょうか?

4

4 に答える 4

4

あなたは自分でそのマッピングをしなければなりません。あなたが望むなら、それはです。Cでは、文字列はnullで終了します。printfしたがって、またはなどのフォーマットされた出力関数を使用してputs、(フォーマット指定子を介して)文字列を出力するように要求すると、最初のnullに達するとすぐに%s印刷が停止します。Cには単語strがありません。文字数が正確にわかっている場合は、それらをループして、選択したニーモニックに置き換えて、文字を個別に印刷することもできます。nullstr0

ドラフトには7.21.6.1/8と書かれています:

p引数は、voidへのポインタでなければなりません。ポインタの値は、実装で定義された方法で、一連の印刷文字に変換されます。

ただし、次のとおりです。

$ cat null.c
#include <stdio.h>
int main() {
 printf("%p\n", (void *)0);
}

生成:

00000000

gcc4.6とclang3.2の両方で。

ただし、深く掘り下げると:

$ cat null.c
#include <stdio.h>
int main() {
 printf("%s\n", (void *)0);
}

確かに望ましい出力を生成します:

(null)

gccとclangの両方で。

標準ではこれが義務付けられていないことに注意してください。

l長さ修飾子が存在しない場合、引数は文字タイプの配列の最初の要素へのポインタでなければなりません。280)配列の文字は、終了するヌル文字まで書き込まれます(ただし、含まれません)。精度が指定されている場合、書き込まれるバイト数はそれ以下です。精度が指定されていないか、配列のサイズより大きい場合、配列にはヌル文字が含まれている必要があります。

この動作に依存すると、驚きにつながる可能性があります。

于 2012-05-30T03:44:09.337 に答える
0

文字列を。で出力する代わりに、char配列内の特定のcharがaであるかどうかの条件をチェックするループを考え出し%s、次にfor\0NULL

于 2012-05-30T03:45:02.560 に答える
0

puts()のC ++リファレンスから(私の強調):

strが指すC文字列をstdoutに書き込み、改行文字('\ n')を追加します。関数は、指定されたアドレス(str)から、終了ヌル文字('\ 0')に達するまでコピーを開始します。この最後のヌル文字はstdoutにコピーされません。

あなたが持っているようなデータを処理するには、長さを知る必要があります。そこから、文字をループするだけです。

/* ugly example */
char* str = "AAAA\x00\x00\x00...\x11\x11\x11\x11\x00\x00...";
int len = ...; /* get the len somehow or know ahead of time */
for(int i = 0; i < len; ++i) {
  if('\0' == str[i]) {
    printf(" (null) ");
  } else {
    printf(" %c ", str[i]);
  }
}    
于 2012-05-30T03:57:40.490 に答える
0

C の重要な基礎の 1 つは、文字列が '\0' で終了することです。誰もがそのルールに従って生活しています。そのため、文字列を文字列ではなく、文字の配列と考えることをお勧めします。

配列をトラバースして '\0' をテストすると、文字の代わりに "(null)" を出力できます。ここに例があります。char * strchar 配列として、または を使用してスタック上に作成されたことに注意してくださいmalloc。このコードでは、実際のバッファー サイズを知る必要があります。

char* str = "AAAA\x00\x00\x00...\x11\x11\x11\x11\x00\x00...";
int iStrSz = <str's actual buffer size>

int idx;

for(idx=0; idx<iStrSz; idx++)
{
   if('\0' == *(str + idx)
   {
      sprintf("%s", "(null)");
   }
   else
   {
      putchar(*(str + idx));
   }
}

printf("%s", "\n");
于 2012-05-30T10:51:44.243 に答える