HOWTO · C

C で書式付き文字列を作成する

これは、C プログラミング言語での文字列の書式設定に関するコンパクトな記事です。

この記事では、printf() 関数で行うような方法で C 言語を使用して文字列をフォーマットする方法について説明します。たとえば、文字列リテラルとさまざまな変数の値を組み合わせて文字列を生成し、結果を文字列に代入します。 将来の使用のための変数。

C 言語には、書式設定された文字列を返す組み込みライブラリ メソッドがいくつかあります。 それらの最も一般的に使用される2つの機能は次のとおりです。

  1. sprintf()メソッド
  2. snprintf()メソッド

これらの関数とその例の両方について説明します。

C で sprintf() 関数を使用して書式付き文字列を作成する

sprintf() のプロトタイプは次のとおりです。

int sprintf(char* str, const char* format, ...);

文字列の内容は、フォーマットが printf で使用された場合、印刷されるのではなく、str によって参照されるバッファーに C 文字列として格納されます。 バッファ サイズは、完全な結果文字列を保持するのに十分な大きさにする必要があります。

コンテンツに続いて、ヌル文字が自動的に挿入されます。

この関数には、この関数の 2 番目の引数で使用されている書式指定子と正確に 1 対 1 で対応するために、少なくとも必要な数の追加の引数が必要です。

パラメーター:

  • char * str

    結果の文字列が格納される文字ポインタです。 このポインターのサイズは、フォーマットで指定されたすべてのデータに対応できる大きさにする必要があります。

  • const char * format

    これは、printf 関数で指定したすべての仕様を持つ文字列形式を含む文字ポインタでもあります。

  • ...

    関数には、フォーマット文字列 (または n の場合は格納場所へのポインター) に応じて、フォーマット文字列内のフォーマット指定子を置き換える値を保持する追加の引数のセットが必要になる場合があります。

    これらのパラメーターの数は、少なくとも、フォーマット指定子で示される値の数と等しくなければなりません。 関数は追加の引数を無視します。

戻り値:

この関数は、結果の文字列に書き込まれた文字数を指定する int 値を返します。 この文字数には、文字列の末尾に自動的に追加されるヌル文字は含まれません。

何らかのエラーが発生した場合、またはその文字列に何も書かれていない場合は、負の数が返されます。

例:

#include <stdio.h>

int main() {
  char arr[60];
  int num, i = 4, j = 2;
  num = sprintf(arr, "%d plus %d is %d", i, j, i + j);
  printf("[%s] string is %d characters long\n", arr, num);
  return 0;
}

上記のコードの出力は次のとおりです。

[4 plus 2 is 6] string is 13 characters long

上記のコード スニペットでは、固定サイズの char 配列を宣言したことがわかります。 次に、その配列を sprintf 関数で使用して内容を保存しました。

たとえば、sprintf 関数の format 文字列が指定された配列のサイズを超えると、メモリ エラーが発生し、プログラムが異常終了します。 この面倒を避けるために、この関数のより安全なバージョンである snprintf 関数が使用されます。

C で snprintf() 関数を使用して書式付き文字列を作成する

この関数のプロトタイプは次のとおりです。

int snprintf(char* s, size_t n, const char* format, ...);

文字列の内容は、フォーマットが printf で使用された場合に出力される代わりに、s が指すバッファーに C 文字列として格納されます (n を最大バッファー容量として使用します)。

この場合、結果の文字列のサイズが n-1 より大きい場合、余分な残りの文字はすべて文字列として破棄されますが、戻り値の文字数としてカウントされます。

マテリアルが書き込まれた後、null 文字が自動的に追加されます。

この関数には、少なくとも format パラメーターの後に format に必要な数の追加の引数が必要です。

パラメーター:

  • char * s

    結果の文字列の内容を保存するための文字ポインタです。 この配列のサイズは、少なくとも n 文字の長さにする必要があります。

  • size_t n

    バッファに書き込む最大文字数を示す符号なし整数型です。 記述できる最大文字数は n-1 で、文字列の末尾に追加されるヌル文字を 1 文字残します。

  • const char * format

    これは、printf 関数で指定したすべての仕様を持つ文字列形式を含む文字ポインタでもあります。

  • ...

    関数には、フォーマット文字列 (または n の場合は格納場所へのポインター) に応じて、フォーマット文字列内のフォーマット指定子を置き換える値を保持する追加の引数のセットが必要になる場合があります。

    これらのパラメーターの数は、少なくとも、フォーマット指定子で示される値の数と等しくなければなりません。 関数は追加の引数を無視します。

戻り値:

この関数は、終端のヌル文字を除いて、バッファに正常に書き込まれた文字数を返します。 エラーが発生した場合は、負の数を返します。

戻り値が 0 より大きく、指定されたバッファ サイズより小さい場合、文字列は完全に書き込まれます。

例:

#include <stdio.h>

int main() {
  char arr[100];
  int count;

  count = snprintf(arr, 100, "The double of %d is %d", 5, 5 * 2);

  if (count >= 0 && count < 100)  // check returned value
    printf("The resultant string is: %s", arr);
  else
    printf("Not successfully written");
  return 0;
}

出力:

The resultant string is: The double of 5 is 10