ITメモ
C言語 / Programming Language C
開発環境 / Development Environment
【Mac】Xcode【Win】Visual Stadio
基礎 / Basic
About C言語書式コメントコンパイルとリンクメイクファイル / Makefileヘッダファイル変数定数型 / Type配列 / Arrayポインタ / Pointer演算子 / Operator制御文 / Control Statement関数指定子 / 修飾子構造体と共用体 / Structure & Unionプリプロセッサ / PreprocessorthisキーワードTypedef
入出力 / Input & Output
入出力入力フォーマット指定子出力フォーマット指定子「printf」関数を使って文字を出力・表示させる方法「printf_s」関数を使って文字を出力・表示させる方法「scanf」関数を使って入力させる方法「scanf_s」関数を使って入力させる方法「getchar」関数を使って「1文字」だけ入力させる方法「gets」関数を使って「文字列」を入力させる方法
文字列 / String
文字列 / String「snprintf」関数で「配列」に文字列を書き込む方法
ネットワーク / Network
memset - メモリブロックのセット
メモリー管理
メモリー
オペレーション / Operation
ファイルを操作をする方法コマンドラインプログラム / Command-Line Programプロセス / Processソケット通信 / Socket Communication
用語集 / Glossary
サブルーチン / Subroutineスタックとキュー / Stack & Cueスレッド / Thread
C言語標準ライブラリ(ヘッダファイル)
C言語標準ライブラリ【assert.h】 - 診断機能【complex.h】 - 複素数計算【ctype.h】 - 文字操作【errno.h】 - エラー【fenv.h】 - 浮動小数点環境【float.h】 - 浮動小数点型の特性【inttypes.h】 - 整数型の書式の変換【iso646.h】 - 代替つづり(Alternate spellings)【limits.h】 - 整数型の大きさ【locale.h】 - 文化圏固有操作【math.h】 - 数学【setjmp.h】 - 非局所分岐【signal.h】 - シグナル操作【stdalign.h】 - アライメント【stdarg.h】 - 可変個数の実引数【stdatomic.h】 - アトミック操作【stdbool.h】 - 論理型および論理値【stddef.h】 - 共通の定義【stdint.h】 - 整数型【stdio.h】 - 入出力【stdlib.h】 - 一般ユーティリティ【stdnoreturn.h】 - _Noreturn【string.h】 - 文字列操作【tgmath.h】 - 型総称数学関数(Type-generic math)【threads.h】 - マルチスレッド【time.h】 - 日付及び時間【uchar.h】 - Unicodeユーティリティ【wchar.h】 - 多バイトおよびワイド文字拡張ユーティリティ【wctype.h】 - ワイド文字種分類およびワイド文字大文字小文字変換ユーティリティ
C言語ライブラリ(ヘッダファイル)
C言語ヘッダファイル【winsock.h】





【C言語】「snprintf」関数で「配列」に文字列を書き込む方法

【C言語】
「snprintf」関数で「配列」に文字列を書き込む方法




「C言語」の「snprintf」関数は、
「配列」に「文字列」を書き込むことができる関数。


「snprintf」関数は、
「文字列」を操作できる関数の一つで、
指定した「文字列書式」に従って、
指定した「文字数分」だけ
「配列」に「文字列」を書き込むことができる。


配列に、指定した「文字列」を書き込むだけなので、
標準出力などに出力したい場合は、
「printf」関数が必要。



詳しくは、
下記をご参照ください。



「snprintf」とは


「snprintf」関数は、
「C言語」において、
「変換指定文字列」などを使用して
指定した「文字列書式」に従い、
指定した「文字数分」だけ
「配列」に「文字列」を書き込むことができる「関数」。


Back

「snprintf」関数の構文


「snprintf」関数を使用するには、
下記のフォーマットに従って記述することで、
「配列」に「文字列」を書き込むことができる。


簡単な使い方では、
・書き込む「配列」
・文字数
・書き込む「文字列」
を指定すれば、
「snprintf」関数を実行できる。



「snprintf」関数の書式
#include <stdio.h>
int snprintf(
char * restrict s,
size_t n,
const char * restrict format,
...
);


int snprintf( char * restrict s, size_t n, const char * restrict format, ... );
int snprintf( 文字配列 (書き込まれる配列), 書き込む文字数, 書き込む文字列, ...);

int snprintf( 文字配列 (書き込まれる配列), 書き込む文字数, 書き込む文字列);
int snprintf( 文字配列 (書き込まれる配列), 書き込む文字数, 書き込む文字列(変換指定文字列を含む), 変換する値);
int snprintf( 文字配列 (書き込まれる配列), 書き込む文字数, 書き込む文字列(複数の変換指定文字列を含む), 変換する値, 変換する値, ...);
int snprintf( 文字配列 (書き込まれる配列), 書き込む文字数, "%0*d", 最小フィールド幅, 変換する値, ...);
int snprintf( 文字配列 (書き込まれる配列), 書き込む文字数, "%0*d, %0*d, ...", 最小フィールド幅, 変換する値,, 最小フィールド幅, 変換する値, ...);
int snprintf( 文字配列 (書き込まれる配列), 書き込む文字数, "%0.*d", 表示する文字数, 変換する値, ...);
int snprintf( 文字配列 (書き込まれる配列), 書き込む文字数, "%0.*d, %0.*d, ...", 表示する文字数, 変換する値, 表示する文字数, 変換する値, ...);


文字配列を標準出力に出力するコード
printf("%s\n", 文字配列);



引数
引数説明
s 文字配列 (書き込まれる配列)
「format」が指す書式文字列に従って「s」が指す文字配列へ書き込みを行う。
n 書き込む文字数
引数の「n」で指定した書き込み文字数をオーバーした分は、
書き込まれず破棄される。
引数「n」に、「0」を指定した場合は、
「snprintf」には、何も書き込みされない。
その時は、引数「s」に、「空ポインタ (NULL)」を指定してもOK。
format 書き込む文字列(変換指定文字列を利用して記述する)
「snprintf」関数は、
書き込まれた文字配列の最後にはナル文字 「'\0'」 が書き込まれる。


返り値
返り値説明
成功した場合 書き込んだ文字数 (終端ナル文字は含ない)
「返り値」が、「負の値」でなく、
「n(書き込み文字数)」未満の場合には、
完全に書き込まれたことになる。
失敗した場合負の値



サンプルプログラム
//ヘッダファイル
#include <stdio.h>
#include <stdlib.h>



//マクロ
#define StringNum 256

//プログラムコード
int main(void) {
char sampleArray[StringNum] = {'\0'};
char name[] = "サンプルネーム";
char address[] = "東京";
int age = 4;

snprintf(sampleArray, StringNum, "%sさんは、%sに%d年間住んでいます。", name, address, age);

printf("%s\n", sampleArray);

return EXIT_SUCCESS;
}


Back

引数で使用する「変換指定」のフォーマット


引数で使用する「変換指定」のフォーマットは、
%[引数順][フラグ][最小フィールド幅][.精度][長さ修飾子]変換指定子


一番シンプルな変換指定
%変換指定子
という書式で指定する。
「変換指定文字」を利用した場合は、
最低でも、「%変換指定子」を記述することになる。


「変換指定文字列」は、

・変換指定子をひとつ以上含む文字列
・「%」記号から始まる
・「変換指定文字列」以外の文字列はそのまま出力される

などの条件があります。


「printf」関数の
引数で指定した「書式文字列」内に、
次の引数以降の「文字列」「変数の値」を組み込むには、
「%」記号の後に、
「変数の型」を表す「変換指定子」を記述することで、
引数で指定した文字列の中にある
「変換指定文字」で指定した「文字列」「変数値」に置換えて、
文字列を表示することができる。






変換指定文字列「変換指定子」の種類

「変換指定子」は、
「引数」で指定した値を表示する形式を指定する。

「変換指定文字列」を使用して出力をする場合、
「変換指定子」は、

・「アルファベット」「記号」の「1文字」で指定する
・「変換指定子」を省略することはできない

というルールがある。


「変換指定子」として使える文字
変換指定子説明
d符号付きの「10進整数」を扱う「変換指定子」。
i符号付きの「10進整数」を扱う「変換指定子」。
u符号なしの「10進整数」を扱う「変換指定子」。
o符号なしの「8進整数」を扱う「変換指定子」。
x、X 符号なしの「16進整数」を扱う「変換指定子」。
「x」は、アルファベットの「小文字」で表示。
「X」は、アルファベットの「大文字」で表示。
f、F 「浮動小数点数」を扱う「変換指定子」。
「小数点以下(ddd.ddd)」を表示する
「F」は、アルファベットを「大文字」で表示する。
e、E 「浮動小数点数」を扱う「変換指定子」。
「小数」の「指数表記(ddd.ddde±dd)」
「E」は、指数を表す「e」を「大文字」で表示する。
g、G 「浮動小数点数」を扱う「変換指定子」。
小数の16進指数表記(0xddd.dddp±dd)
「f」または「e」での変換のどちらか表示が短い方で表示。
指数部が「-4」より小さい場合か、「精度指定」以上の場合に、「e」が使用される。
「G」はアルファベットを「大文字」で表示する。
a、A 「16進浮動小数点数」を扱う「変換指定子」。
「A」は、アルファベットを「大文字」で表示する。
c 「文字」を扱う「変換指定子」。
「int型」の実引数を「unsigned char型」に変換し、結果を「文字」で表示する
s 「文字列」を扱う「変換指定子」。
「文字列」への「ポインタ」を実引数に指定し、末尾にある「null文字」の直前まで表示する。
p 「ポインタ」を扱う「変換指定子」。
任意の型のポインタを実引数に指定し、16進数で表示
n 「整数へのポインタ」を扱う「変換指定子」。
現時点までに出力された文字数を整数へのポインタに格納する。
※Visual Studioではセキュリティ上の問題で標準では無効
% 「%」を表示する「変換指定子」。
「%%」と入力することで、「%」を文字として扱う。

Back



変換指定文字列「フラグ」の種類

「変換指定文字列」の「フラグ」は、
「出力位置」「変換指定文字列の意味」を設定することができる。

「フラグ」は、
・「複数指定」が可能
・「順序」は任意
・「フラグ」は省略可能
という条件で記述する。



変換指定文字列「フラグ」の一覧
フラグ説明既定値
- フィールドの左揃え 右揃え
+ 数値の前に、常に「符号(+-)」を表示するフラグ。
「正の数字」=「+」の符号を表示
「負の数字」=「-」の符号を表示
「負の数字」のみ
0 「最小桁数」に達するまで「空白」を「0」に変換して埋めるフラグ。
「整数値」の「精度指定」がされている場合
「-」フラグと同時指定された場合
などは、「0」フラグは「無効」となる。
空白で埋める
空白 「符号付き」の「数値」で符号が表示されない場合に、空白で埋めるフラグ。
「+」フラグと同時に指定された場合は、
「空白」フラグは無効となる。
何もしない
# 「o」変換(8進数表記)の場合、
先頭に「0」が追加される値が「0」の場合は何もしない
何もしない
# 「x、X」変換(16進数表記)の場合、
先頭に「0x、0X」が追加される値が「0」の場合は何もしない
何もしない
# 「e、E、f、F、a、A」変換(小数値)の場合、
小数点以下の数値を表示しない場合でも「小数点」を表示する
何もしない
# 「g、G」変換(double型)の場合、
小数点以下の数値を表示しない場合でも「.0」を表示する
何もしない
#上記以外の変換に「#」フラグを使用した場合は、未定義となる-

Back



変換指定文字列「最小フィールド幅」の種類

変換指定文字列「最小フィールド幅」は、
表示される「文字列」の「最小文字数」を指定する「変換指定文字」。

表示する文字数が、
指定よりも多い文字数の場合は、
自動で拡張され、全部表示される。

変換指定文字列「最小フィールド幅」は、
省略も可能。
使用するときだけ記述する。


変換指定文字列「最小フィールド幅」の指定は、
・正の整数値
・アスタリスク(*)
で指定する。

「アスタリスク(*)」で指定した場合は、
次の「引数」に記述する「数値」が、
「最小フィールド幅」の値として設定される。
「"%0*d, %0*d, ・・・・・", 最小フィールド幅, 変換される値, 最小フィールド幅, 変換される値...」

printf("%0*d, %0*d", 最小フィールド幅, 数値, 最小フィールド幅, 数値);

printf("%0*d, %0*d", 5, 123, 5, 456);

00123, 00456

Back



変換指定文字列「精度指定」の種類

変換指定文字列「精度指定」は、
表示する「文字列」の「文字数」を指定する「変換指定文字」

変換指定文字列「精度指定」は、
指定しない場合は「省略可能」。


変換指定文字列「精度指定」の指定は、
・「.(ピリオド)」に続く「正の整数値」
・「.(ピリオド)」に続く「アスタリスク(*)」
で指定する。
「アスタリスク(*)」指定の時の「負数」による「精度指定」には反応しない。

「アスタリスク(*)」で指定した場合は、
次の「引数」に記述する「数値」が、
「最小フィールド幅」の値として設定される。
「"%0.*d, %0.*d, ・・・・・", 精度指定, 変換される値, 精度指定, 変換される値...」

printf("%0.3d, %0.3d", 数値, 数値);
printf("%0.*d, %0.*d", 最小フィールド幅, 数値, 最小フィールド幅, 数値);

printf("%0.5d, %0.5d", 123, 456);
printf("%0*d, %0*d", 5, 123, 5, 456);

00123, 00456
00123, 00456



変換指定文字列「精度指定」の一覧
変換指定子説明既定値
d、i、o、u、x、X 最小桁数の指定
指定の値が実際の文字数よりも小さい場合は0で埋める
1
e、E、f、F 小数部(小数点の後ろの数値)の有効桁数の指定 桁の最後は丸められる(四捨五入される) 6
g、G有効桁数の指定6
s有効文字列数表示される文字列の文字数
上記以外の変換指定子に精度指定をした場合の動作は未定義です。
Back



変換指定文字列「長さ修飾子」の種類

変換指定文字列「長さ修飾子」は、
実引数の「データ型」の「サイズ」を指定する「変換指定文字」。
変換指定文字列「長さ修飾子」は、
使用しない場合は、「省略可能」です。


変換指定文字列「長さ修飾子」の一覧
長さ修飾子変換指定子データ型
hhd、i、o、u、x、Xchar型、unsigned char型
nchar型のポインタ
hd、i、o、u、x、Xshort型、unsigned short型
nshort型のポインタ
l(小文字のL)d、i、o、u、x、Xlong型、unsigned long型
nlong型のポインタ
ll(小文字のLL)d、i、o、u、x、Xlong long型、unsigned long long型
nlong long型のポインタ
La、A、e、E、f、F、g、Glong double型
jd、i、o、u、x、Xintmax_t型(対応する中で最大の整数値を扱うデータ型)
zd、i、o、u、x、Xsize_t型
td、i、o、u、x、Xptrdiff_t型(ポインタ同士を減算した値を扱う型)


「Microsoft」独自の拡張長さ修飾子
長さ修飾子変換指定子データ型
l(小文字のL)a、A、e、E、f、F、g、Glong double型
hc、C1バイト文字
I32d、i、o、u、x、X__int32型、unsigned __int32型
I64d、i、o、u、x、X__int64型、unsigned __int64型


Back