7

文字列と長さを含む構造体があります。

typedef struct string {
  char* data;
  size_t len;
} string_t;

これはすべてうまくてダンディです。printfしかし、のような関数 を使用して、この構造体の内容を出力できるようにしたいと考えています。datanul ターミネータがない (または間違った場所にある) 可能性があるため、単に使用することはできません%s。しかし、%.*s指定子には が必要intですが、私はsize_t.

問題は、どのように文字列を出力できるかということprintfです。

4

3 に答える 3

4

簡単な解決策は、フォーマットされていない出力を使用することです。

fwrite(x.data, 1, x.len, stdout);
fwrite はすべてを書き込めない可能性があるため、これは実際には悪い形式です。そのため、ループで使用する必要があります。
for (size_t i, remaining = x.len;
     remaining > 0 && (i = fwrite(x.data, 1, remaining, stdout)) > 0;
     remaining -= i) {
}

(編集:fwrite実際、成功すると要求された範囲全体が書き込まれます。ループは必要ありません。)

x.lenが より大きくないことを確認してくださいSIZE_T_MAX

于 2013-10-02T20:24:21.677 に答える
1

printf を使用して文字列を出力するにはどうすればよいですか?

1回の通話で?奇妙な場所にnullターミネータがある可能性があると言うので、意味のある方法ではできません。一般に、バッファに印刷できない文字が含まれている可能性がある場合、文字列を出力するときにそれらの文字をどのように印刷するか (または印刷しないか) を決定する必要があります。ループを作成し、各文字をテストし、ロジックに従って出力します (または出力しません)。

于 2013-10-02T20:15:29.163 に答える