C言語編 標準ライブラリのリファレンス「S」

先頭へ戻る

このエントリーをはてなブックマークに追加

「S」で始まる標準ライブラリ関数及び、その他の定義です。

scanf関数

概要 標準入力から、フォーマット指定付きで文字列を受け取る。
ヘッダ stdio.h
形式 int scanf(const char* format, ...);
引数 format フォーマット指定文字列。
... 入力された値を受け取るアドレスの指定。 format に含まれているフォーマット指定子に対応した個数と型であること。
戻り値 エラーが発生した場合には EOF を返す。 その他の場合には、正常に値の代入を行えた個数を返す。
詳細 入力された値が、可変個引数の部分に指定したアドレスへ格納される。
引数format の基本形式は、"%d" や "%s" といったように、指定の開始を意味する %記号と、変換指定文字の組み合わせである。 この指定の組み合わせ1つにつき、引数... の個数を1つ増やす。
変換指定文字には以下のものがある。
d 符号付き 10進整数。
i 符号付き整数。
printf系の関数にある i変換指定文字と異なり、d とは意味が違うことに注意。 d が 10進整数のみ受け付けるのに対し、i は 先頭に 0 や 0x が付加された 8進数や 16進数の値も受け付ける。
u 符号無し 10進整数
o 符号無し 8進整数
x 符号無し 16進整数。
a-f が大文字・小文字のいずれであるかは問わない。 したがって、printf系の関数にあるような X指定は無い。
f、e、g 符号付き 10進浮動小数点数。科学的記数法でも構わない。
printf系の関数と異なり、f、e、g はいずれも全く同じものである。
a f、e、g の各変換指定文字と同一。C99規格で追加された。
printf系の関数で a が追加されたことに合わせて導入されたと思われる。
c 文字
s 文字列
p ポインタの表現形式に従って、void**型の実引数へ格納する。
例えば、sprintf関数の %p変換で、配列にポインタの値を文字列化した後、 sscanf関数の %p変換で void*型の変数へ再変換できる。
n この変換指定が現れるまでに入力された文字数に変換され、対応する実引数(整数変数へのポインタでなければならない)に格納する。
[ 受け付けるべき文字を限定的にした文字列変換。"%[" から "]" の間に、受け付ける文字を書き並べる。
例えば、"%[abc]" という指定によって、'a'、'b'、'c' いずれかの文字で構成された文字列が、変数へ格納される。
また、[ の直後に ^ を置くことによって、書き並べた文字以外を受け付けるという否定的な意味に変わる。 "%[abc]" とすれば、'a'、'b'、'c' 以外の文字で構成された文字列が、変数へ格納される。
% "%%" というように 2つ並べることによって、%記号1つに変換される。

指定開始文字% の直後に、* を置いた場合、変数への格納が抑制される。 例えば、"%*d %s" という指定に対して、「100 abc」という入力がなされた場合、 %d 指定の効果によって、100 は読み取られるが、変数への格納は行われず、後続の %s変換へ進む。

任意で * を置いた直後には、最大フィールド幅の指定を置いても良い。 これは、10進整数で指定し、変換結果が最大で何文字分の幅を取るかを意味する。 例えば、"%10s" という指定によって、文字列を 10文字分まで読み取る。

任意で最大フィールド幅の指定を置いた直後には、変換修飾子を置いても良い。 これには、以下のものがある。 これらの指定は、変換指定文字が n の場合には、対応する実引数が、どのような型へのポインタであるかを指示するという意味になる。
l 整数を変換する際、対象の型が long型または unsigned long型であることを指示する。 また、変換指定文字が n の場合は、対応する実引数の型が long* であることを指示する。
文字や文字列の場合( %[指定も含まれる)には、対象の型が wchar_t型であることを指示する。
浮動小数点数の場合には、対象の型が double型であることを指示する。 特に、このケースは、printf系の関数では必要とされないが、scanf系の関数では必要であることに注意。
ll C99規格で追加された。
整数を変換する際、対象の型が long long型または unsigned long long型であることを指示する。 また、変換指定文字が n の場合は、対応する実引数の型が long long* であることを指示する。
浮動小数点数の場合には、対象の型が long double型であることを指示する。 特に、このケースは、printf系の関数では必要とされないが、scanf系の関数では必要であることに注意。
h 整数を変換する際、対象の型が short型または unsigned short型であることを指示する。 また、変換指定文字が n の場合は、対応する実引数の型が short* であることを指示する。
hh C99規格で追加された。
整数を変換する際、対象の型が char型または unsigned char型であることを指示する。 また、変換指定文字が n の場合は、対応する実引数の型が char* であることを指示する。
L 浮動小数点数を変換する際、対象の型が long double型であることを指示する。
j C99規格で追加された。
整数を変換する際、対象の型が intmax_t型または uintmax_t型であることを指示する。 また、変換指定文字が n の場合は、対応する実引数の型が intmax_t* であることを指示する。
z C99規格で追加された。
整数を変換する際、対象の型が size_t型であることを指示する。 また、変換指定文字が n の場合は、対応する実引数の型が size_t* であることを指示する。
t C99規格で追加された。
整数を変換する際、対象の型が ptrdiff_t型であることを指示する。 また、変換指定文字が n の場合は、対応する実引数の型が ptrdiff_t* であることを指示する。

変換修飾子の直後には、変換指定文字が来る。 これは省略できない。

引数format の中で、空白類文字(半角スペースやタブ文字)は、複数の連続した空白類文字を無視することを表す。 1文字の空白類文字を読み飛ばす目的で、"%d %d" のように、1文字の空白類文字を挟み込んでも、 入力された文字列内で連続していれば全ての空白類文字は読み飛ばされる。
変換指定と合致しない内容の入力が現れた場合、その時点で関数は終了する。
注意 必要な個数の実引数が指定されていない場合の動作は未定義だが、 余分に指定されている場合には、評価は行われるが、scanf関数としては無視する。
使用例
#include <stdio.h>

int main(void)
{
	int num;
	char str[80];
	char numbers[80];
	char no_numbers[80];

	/* 以下のいずれか1つを有効にして試すこと */
	/* 複数同時に試すと、入力の最後に現れる改行文字のために、正しく処理できない */
	/* 1度に試すのなら、それぞれの scanf関数の直後で、
	       scanf( "%*[^\n]" );
	   のようにして、実際に受け取った内容の直後から改行文字の直前までを読み飛ばし、
	   更に、
	       scanf( "%*c" );
	   として、改行文字を読み飛ばすといった工夫が必要である。
	*/

	scanf( "%d", &num );
	scanf( "%d %s", &num, str );            /* str が溢れる危険性あり */
	scanf( "%d %79s", &num, str );          /* str が溢れることはない */
	scanf( "%[0123456789]", numbers );      /* やはり numbers は溢れる危険性がある */
	scanf( "%[^0123456789]", no_numbers );  /* やはり no_numbers は溢れる危険性がある */
	scanf( "%79[0123456789]", numbers );    /* numbers が溢れることはない */

	return 0;
}

実行結果:


	
関連 任意のストリームに対して同様のフォーマット指定を行い出力するには、fscanf関数を使う。 変換結果を文字配列に格納するには sscanf関数が使える。
実引数... の代わりに、va_list を用いたバージョンとして、vscanf関数がある。
C95規格からは、ワイド文字に対応した wscanf関数が追加されている。
解説章 第7章

SCHAR_MAX

概要 signed char型の最大値を表す。
ヘッダ limits.h
形式 #define SCHAR_MAX 127
置換結果 signed char型で表現可能な最大値。
詳細
注意 signed char型の大きさは必ず 1Byte であるが、これが何bit であるかは環境依存である。 ただし、圧倒的多数の環境で 1Byte は 8bit である。 ビット数を調べるには CHAR_BITマクロを使う。
char型、signed char型、unsigned char型はすべて異なる型である。 char型としての最大値を調べる際には、CHAR_MAXマクロを使わなければならない。
使用例
#include <stdio.h>
#include <limits.h>

int main(void)
{
	printf( "%d\n", SCHAR_MAX );

	return 0;
}

実行結果:

127
関連 signed char型の最小値は SCHAR_MIN で表される。
解説章 第20章

SCHAR_MIN

概要 signed char型の最小値を表す。
ヘッダ limits.h
形式 #define SCHAR_MIN -128
置換結果 signed char型で表現可能な最小値。
詳細
注意 signed char型の大きさは必ず 1Byte であるが、これが何bit であるかは環境依存である。 ただし、圧倒的多数の環境で 1Byte は 8bit である。 ビット数を調べるには CHAR_BITマクロを使う。
char型、signed char型、unsigned char型はすべて異なる型である。 char型としての最小値を調べる際には、CHAR_MINマクロを使わなければならない。
使用例
#include <stdio.h>
#include <limits.h>

int main(void)
{
	printf( "%d\n", SCHAR_MIN );

	return 0;
}

実行結果:

-128
関連 signed char型の最大値は SCHAR_MAX で表される。
解説章 第20章

SCNdMAX

概要 intmax_t型に対する scanf関数の変換指定文字列。
ヘッダ inttypes.h
形式 #define SCNdMAX "lld"
置換結果 intmax_t型の値を入力する際に、 scanf関数の変換指定文字列として使用できる文字列定数。
詳細 例えば、intmax_t型が long long型に相当する場合、変換指定文字列は "lld" となるべきであり、 SCNdMAXマクロは、そのように置換される。
なお、置換結果に "%" は含まれていないため、連続する文字列定数が連結されることを利用して、「"%" SCNdMAX」のように使う。
注意
使用例
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(void)
{
	const char s[] = "1000";

	intmax_t a;
	sscanf( s, "%" SCNdMAX, &a );
	printf( "%" PRIdMAX "\n", a );

	return 0;
}

実行結果:

1000
関連 scanf関数の変換指定文字列において、"d" と "i" が同義であることに対応して、 SCNiMAXマクロも存在している。意味は SCNdMAXマクロと同じ。
解説章

SCNiMAX

概要 intmax_t型に対する scanf関数の変換指定文字列。
ヘッダ inttypes.h
形式 #define SCNdMAX "lli"
置換結果 intmax_t型の値を入力する際に、 scanf関数の変換指定文字列として使用できる文字列定数。
詳細 例えば、intmax_t型が long long型に相当する場合、変換指定文字列は "lli" となるべきであり、 SCNiMAXマクロは、そのように置換される。
なお、置換結果に "%" は含まれていないため、連続する文字列定数が連結されることを利用して、「"%" SCNiMAX」のように使う。
注意
使用例
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(void)
{
	const char s[] = "1000";

	intmax_t a;
	sscanf( s, "%" SCNiMAX, &a );
	printf( "%" PRIiMAX "\n", a );

	return 0;
}

実行結果:

1000
関連 scanf関数の変換指定文字列において、"d" と "i" が同義であることに対応して、 SCNdMAXマクロも存在している。意味は SCNiMAXマクロと同じ。
解説章

SCNoMAX

概要 8進数で表現された uintmax_t型の値を入力する際の scanf関数の変換指定文字列。
ヘッダ inttypes.h
形式 #define SCNoMAX "llo"
置換結果 uintmax_t型の値を入力する際に、 scanf関数の変換指定文字列として使用できる文字列定数。
詳細 例えば、uintmax_t型が unsigned long long型に相当する場合、 8進数で入力するための変換指定文字列は "llo" となるべきであり、 SCNoMAXマクロは、そのように置換される。
なお、置換結果に "%" は含まれていないため、連続する文字列定数が連結されることを利用して、「"%" SCNoMAX」のように使う。
注意
使用例
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(void)
{
	const char s[] = "1750";

	uintmax_t a;
	sscanf( s, "%" SCNoMAX, &a );
	printf( "%" PRIuMAX "\n", a );

	return 0;
}

実行結果:

1000
関連 10進数で表現された uintmax_t型の値を入力するには SCNuMAX、 16進数の場合は SCNxMAX を用いる。
解説章

SCNuMAX

概要 10進数で表現された uintmax_t型の値を入力する際の scanf関数の変換指定文字列。
ヘッダ inttypes.h
形式 #define SCNoMAX "llu"
置換結果 uintmax_t型の値を入力する際に、 scanf関数の変換指定文字列として使用できる文字列定数。
詳細 例えば、uintmax_t型が unsigned long long型に相当する場合、 10進数で入力するための変換指定文字列は "llo" となるべきであり、 SCNuMAXマクロは、そのように置換される。
なお、置換結果に "%" は含まれていないため、連続する文字列定数が連結されることを利用して、「"%" SCNuMAX」のように使う。
注意
使用例
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(void)
{
	const char s[] = "1000";

	uintmax_t a;
	sscanf( s, "%" SCNuMAX, &a );
	printf( "%" PRIuMAX "\n", a );

	return 0;
}

実行結果:

1000
関連 8進数で表現された uintmax_t型の値を入力するには SCNoMAX、 16進数の場合は SCNxMAX を用いる。
解説章

SCNxMAX

概要 16進数で表現された uintmax_t型の値を入力する際の scanf関数の変換指定文字列。
ヘッダ inttypes.h
形式 #define SCNoMAX "llx"
置換結果 uintmax_t型の値を入力する際に、 scanf関数の変換指定文字列として使用できる文字列定数。
詳細 例えば、uintmax_t型が unsigned long long型に相当する場合、 16進数で入力するための変換指定文字列は "llx" となるべきであり、 SCNxMAXマクロは、そのように置換される。
なお、置換結果に "%" は含まれていないため、連続する文字列定数が連結されることを利用して、「"%" SCNxMAX」のように使う。
注意
使用例
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(void)
{
	const char s[] = "3e8";

	uintmax_t a;
	sscanf( s, "%" SCNxMAX, &a );
	printf( "%" PRIuMAX "\n", a );

	return 0;
}

実行結果:

1000
関連 8進数で表現された uintmax_t型の値を入力するには SCNoMAX、 10進数の場合は SCNuMAX を用いる。
scanf関数の変換指定文字列では、printf関数のように、 16進数のアルファベット(a〜f) が大文字か小文字かの違いは無いため、 SCNXMAX のようなマクロは存在しない。
解説章

SEEK_CUR

概要 シーク動作の起点がファイルの現在位置であることを表す。
ヘッダ stdio.h
形式 #define SEEK_CUR 1
置換結果 SEEK_SETSEEK_END とは異なる何らかの整数値。
詳細 fseek関数の第3引数に指定し、シーク動作の起点をファイルの現在位置とすることを表す。
注意
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;

	fp = fopen( "test.bin", "rb" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	fseek( fp, 10, SEEK_CUR );

	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果:


	
関連 fseek関数の第3引数に渡せる値として、他に SEEK_SETSEEK_END がある。
解説章 第40章第42章

SEEK_END

概要 シーク動作の起点がファイルの終端であることを表す。
ヘッダ stdio.h
形式 #define SEEK_END 2
置換結果 SEEK_SETSEEK_CUR とは異なる何らかの整数値。
詳細 fseek関数の第3引数に指定し、シーク動作の起点をファイルの末尾とすることを表す。
注意
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;

	fp = fopen( "test.bin", "rb" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	fseek( fp, 0, SEEK_END );

	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果:


	
関連 fseek関数の第3引数に渡せる値として、他に SEEK_SETSEEK_CUR がある。
解説章 第40章第42章

SEEK_SET

概要 シーク動作の起点がファイルの先頭であることを表す。
ヘッダ stdio.h
形式 #define SEEK_SET 0
置換結果 SEEK_CURSEEK_END とは異なる何らかの整数値。
詳細 fseek関数の第3引数に指定し、シーク動作の起点をファイルの先頭とすることを表す。
注意
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;

	fp = fopen( "test.bin", "rb" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	fseek( fp, 10, SEEK_SET );

	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果:


	
関連 fseek関数の第3引数に渡せる値として、他に SEEK_CURSEEK_END がある。
解説章 第40章第42章

setbuf関数

概要 ストリームに、バッファを設定する。
ヘッダ stdio.h
形式 void setbuf(FILE* stream, char* buf);
引数 stream 対象のストリーム。
buf バッファとして使用する配列のアドレス。その配列は BUFSIZ以上の大きさを持たなければならない。
あるいは NULL を指定する。この場合、バッファリングしない。
戻り値 なし
詳細 指定ストリームにバッファを設定する。
引数buf に配列のアドレスを指定すると、その配列をバッファ領域として使用する。 配列は、BUFSIZ の値以上のサイズを持っていなければならない。 引数buf に NULL を指定した場合は、バッファリングを行わない。
この関数を呼ぶタイミングは、対象のストリームがオープンされてから、最初の読み書きが実行されるより前までの間でなければならない。
なお、ストリームの種類ごとにデフォルトのバッファリング設定がなされているが、これは環境によって異なる。 例えば、標準出力ストリームはバッファリングされており、標準エラーストリームはバッファリングされていないことが多いが、 これも環境依存の可能性がある。 こういったデフォルトの設定を変更したい場合に、この関数が使用できる。
注意 引数buf に配列を指定した場合は、対象のストリームを使用している間、その配列が確実に存在し続けなけばならない。
使用例
#include <stdio.h>

int main(void)
{
	char buf[80];
	char stdoutBuf[BUFSIZ];


	/* バッファリングを行う */
	setbuf( stdout, stdoutBuf );

	printf( "文字列を入力して下さい" ); /* 改行なし */
	fgets( buf, sizeof(buf), stdin );
	printf( "入力内容:%s\n", buf );


	/* バッファリング無しに変更 */
	setbuf( stdout, NULL );

	printf( "文字列を入力して下さい" ); /* 改行なし */
	fgets( buf, sizeof(buf), stdin );
	printf( "入力内容:%s\n", buf );

	return 0;
}

実行結果:

Hello
文字列を入力して下さい入力内容:Hello

文字列を入力して下さいHello
入力内容:Hello
関連 setvbuf関数の方が、より詳細な指定が行える。
解説章 第43章

setlocale関数

概要 ロケールに関する設定を行う。
ヘッダ locale.h
形式 char* setlocale(int category, const char* locale);
引数 category 変更する機能のカテゴリ。 標準で用意された各種マクロ(LC_ALLLC_COLLATELC_CTYPELC_MONETARYLC_NUMERICLC_TIME)、 あるいは、環境が独自で追加した LC_ で始まる名称のマクロのいずれかを与える。
locale 対象のカテゴリに与える文字列。あるいは NULL
戻り値 成功した場合は、変更前の(引数locale が NULL の場合は現在の)文字列。 失敗した場合は、NULL。
詳細 引数category で指定したカテゴリのロケールを、引数locale の文字列で変更する。 引数locale に使用できる文字列は、環境に応じて異なるので、それぞれのマニュアル等を参照すること。
引数locale が NULL の場合は、現在のロケールを問い合わせる。
引数locale に "" を指定した場合、実行環境で定義されている標準の設定を使うことを意味する。 また、"C" を指定した場合は、C言語の規格で定義された環境(Cロケール)を使うことを意味する。 setlocale関数によって設定を変更するまでは、デフォルトでCロケールが使用される。
注意 返されたポインタが指す文字列は書き換えてはならない。
使用例
#include <stdio.h>
#include <locale.h>

int main(void)
{
	char* s;

	s = setlocale( LC_ALL, NULL );
	puts( s );

	s = setlocale( LC_ALL, "" );
	puts( s );

	return 0;
}

実行結果:

C
Japanese_Japan.932
関連
解説章

setvbuf関数

概要 ストリームに、バッファを設定する。
ヘッダ stdio.h
形式 int setvbuf(FILE* stream, char* buf, int mode, size_t size);
引数 stream 対象のストリーム。
buf バッファとして使用する配列のアドレス。
NULL を指定した場合は、関数内部で自動的に確保される(setbuf関数の引数buf とは意味が異なることに注意)
mode バッファリングの形式。 _IOFBF_IOLBF_IONBF のいずれかを指定する。
size バッファの大きさ。
戻り値 成功したら 0、失敗したら 0以外が返される。
詳細 指定ストリームにバッファを設定する。
引数buf に配列のアドレスを指定すると、その配列をバッファ領域として使用する。引数size 以上のサイズを持っていなければならない。 引数buf に NULL を指定した場合は、内部で領域を確保する。
この関数を呼ぶタイミングは、対象のストリームがオープンされてから、最初の読み書きが実行されるより前までの間でなければならない。
引数mode に指定した値に応じて、3通りのバッファリングが設定できる。
なお、ストリームの種類ごとにデフォルトのバッファリング設定がなされているが、これは環境によって異なる。 例えば、標準出力ストリームはバッファリングされており、標準エラーストリームはバッファリングされていないことが多いが、 これも環境依存の可能性がある。 こういったデフォルトの設定を変更したい場合に、この関数が使用できる。
注意 引数buf に配列を指定した場合は、対象のストリームを使用している間、その配列が確実に存在し続けなけばならない。
使用例
#include <stdio.h>

int main(void)
{
	char buf[80];
	char stdoutBuf[BUFSIZ];


	/* ラインバッファリングを行う */
	setvbuf( stdout, stdoutBuf, _IOLBF, sizeof(stdoutBuf) );

	printf( "文字列を入力して下さい" ); /* 改行なし */
	fgets( buf, sizeof(buf), stdin );
	printf( "入力内容:%s\n", buf );


	/* バッファリング無しに変更 */
	setvbuf( stdout, NULL, _IONBF, BUFSIZ );

	printf( "文字列を入力して下さい" ); /* 改行なし */
	fgets( buf, sizeof(buf), stdin );
	printf( "入力内容:%s\n", buf );

	return 0;
}

実行結果:

Hello
文字列を入力して下さい入力内容:Hello

文字列を入力して下さいHello
入力内容:Hello
関連 より単純な setbuf関数がある。
解説章 第43章

SHRT_MAX

概要 short int型の最大値を表す。
ヘッダ limits.h
形式 #define SHRT_MAX 32767
置換結果 short int型で表現可能な最大値。
詳細
注意 short int型の大きさはコンパイラ依存であり、上記の形式は short int型が 16bit の環境の場合である。
ただし、16bit未満であることや、int型よりも大きいことはあり得ない。
使用例
#include <stdio.h>
#include <limits.h>

int main(void)
{
	printf( "%d\n", SHRT_MAX );

	return 0;
}

実行結果:

32767
関連 short int型の最小値は SHRT_MIN で表される。
unsigned short型の最小値は 0、最大値は USHRT_MAX で表される。
解説章 第20章

SHRT_MIN

概要 short int型の最小値を表す。
ヘッダ limits.h
形式 #define SHRT_MAX -32768
置換結果 short int型で表現可能な最小値。
詳細
注意 short int型の大きさはコンパイラ依存であり、上記の形式は short int型が 16bit の環境の場合である。
ただし、16bit未満であることや、int型よりも大きいことはあり得ない。
使用例
#include <stdio.h>
#include <limits.h>

int main(void)
{
	printf( "%d\n", SHRT_MIN );

	return 0;
}

実行結果:

-32768
関連 short int型の最大値は SHRT_MAX で表される。
unsigned short型の最小値は 0、最大値は USHRT_MAX で表される。
解説章 第20章

sig_atomic_t

SIG_DFL

概要 シグナル発生時の動作をデフォルトにすることを意味する。signal関数に渡す。
ヘッダ signal.h
形式 #define SIG_DFL (void (*)(int))0
置換結果 signal関数の第2引数の型に合致する定数式。
詳細 シグナル発生時の動作を、デフォルトにする。 signal関数の第2引数に指定する。
注意
使用例
#include <stdio.h>
#include <signal.h>

int main(void)
{
	signal( SIGFPE, SIG_DFL );

	return 0;
}

実行結果


	
関連
解説章

SIG_ERR

概要 signal関数が返す、失敗を表す定数式。
ヘッダ signal.h
形式 #define SIG_ERR (void (*)(int))-1
置換結果 signal関数の戻り値の型に合致する定数式。
詳細 signal関数が失敗した場合に、戻り値として返される。
注意
使用例
#include <stdio.h>
#include <signal.h>

int main(void)
{
	if( signal( SIGFPE, NULL ) == SIG_ERR ){
		puts("error");
	}
	else{
		puts("success");
	}

	return 0;
}

実行結果

success
関連
解説章

SIG_IGN

概要 シグナル発生時、そのシグナルを無視することを意味する。signal関数に渡す。
ヘッダ signal.h
形式 #define SIG_IGN (void (*)(int))1
置換結果 signal関数の第2引数の型に合致する定数式。
詳細 シグナル発生時の動作を、そのシグナルを無視させるようにする。 signal関数の第2引数に指定する。
注意
使用例
#include <stdio.h>
#include <signal.h>

int main(void)
{
	signal( SIGFPE, SIG_IGN );

	return 0;
}

実行結果


	
関連
解説章

SIGABRT

概要 異常終了のシグナルを表すシグナル番号。
ヘッダ signal.h
形式 #define SIGABRT 22
置換結果 0 より大きい整数値。
詳細 abort関数の呼び出しによって起こる異常終了を表すシグナル番号。
注意
使用例
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

static void abort_handler(int sig)
{
	puts( "abort_handler" );
	exit( EXIT_FAILURE );
}

int main(void)
{
	signal( SIGABRT, abort_handler );
	raise( SIGABRT );

	return 0;
}

実行結果

abort_handler
関連 シグナル番号は、signal関数raise関数で使用する。
解説章

SIGFPE

SIGILL

SIGINT

signal関数

概要 シグナルを処理する方法を設定する。
ヘッダ signal.h
形式 void (*signal(int sig, void (*func)(int)))(int);
※整理すると、次のようになる。
typedef void (*func_t)(int);
func_t signal(int sig, func_t func);
引数 sig シグナル番号。
func シグナルハンドラ。
戻り値 成功した場合は、引数sig のシグナル番号に以前に設定されていたシグナルハンドラが返される。 失敗した場合は、SIG_ERR を返す。
詳細 引数sig で指定したシグナルが発生したときの動作を設定する。 設定に失敗した場合は、errno に、不定な正の値が設定される。
引数sig に指定するシグナル番号は、標準で定義された以下の6個と、環境が独自に定義した値のいずれかである。
意味
SIGABRT abort関数の呼び出しによって起こる異常終了。
SIGFPE ゼロ除算のような、誤った算術演算。
SIGILL コンピュータの不正命令によって起こるエラー。
SIGINT Ctrl+C の入力のような、ユーザーとの対話によって起こるシグナル。
SIGSEGV メモリの不正アクセス。
SIGTERM 別プログラムやユーザーからの終了シグナル。

引数func に SIG_DFL を指定した場合は、デフォルトの動作を取る。 SIG_IGN を指定した場合は、無視することを意味する。 これら以外の関数ポインタを指定した場合は、それが指す関数がシグナル発生時に呼び出される。 この場合、そのシグナルが SIGILL だった場合を除いて、 関数が呼び出される直前に、そのシグナルの動作がデフォルトに戻される。 SIGILL の場合に同様のことが行われるかどうかは、環境に依存する。
引数func が指す関数は、その中でプログラムを終了させても良いし、戻っても良い。 戻った場合は、シグナルが発生したところから再開する。 ただし、シグナルの種類が SIGFPE、SIGILL、SIGSEGV または計算例外に対応する他の値(これは環境が任意に定義する)だった場合は、 関数から戻った後の動作は未定義である。
注意 abort関数raise関数以外の方法で発生したシグナルの場合、 引数func が指す関数の内部での以下の行為は未定義の動作になる。
1.「volatile sig_atomic_t」以外の形で宣言された静的記憶域期間を持つ変数を参照する行為。
2.以下の例外を除いて、標準ライブラリ関数を呼び出す行為。 第1引数に渡されてきたシグナル番号を、第1引数に指定した signal関数の呼び出しを除く。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

static void abort_handler(int sig)
{
	puts( "abort_handler" );
	exit( EXIT_FAILURE );
}

int main(void)
{
	puts( "aaaaa" );

	signal( SIGABRT, abort_handler );
	abort();

	puts( "bbbbb" );

	return 0;
}

実行結果:

aaaaa
abort_handler
関連 raise関数によってシグナルを発生させることができる。
解説章

SIGSEGV

SIGTERM

sin関数

概要 正弦を計算する。
ヘッダ math.h
形式 double sin(double x);
引数 x 求める角のラジアン値。
戻り値 引数x を角θのラジアン値としたときの正弦。
詳細 いわゆる三角関数のサインを求める関数である。
注意 実装方法によるが、誤差の度合いや、誤差の生まれ方の特徴は異なるので、許容できるかどうかはよく調べる必要がある。
使用例
#include <stdio.h>
#include <math.h>

#define DEG_TO_RAD(deg)  ((deg) / 180.0 * 3.14159265358979323846)  /* 度からラジアンへの変換 */

int main(void)
{
	double deg = -180.0;
	int i;

	for( i = 0; i <= 8; ++i ){
		printf( "sin(%.1f) = %f\n", deg, sin(DEG_TO_RAD(deg)) );
		deg += 45.0;
	}

	return 0;
}

実行結果:

sin(-180.0) = -0.000000
sin(-135.0) = -0.707107
sin(-90.0) = -1.000000
sin(-45.0) = -0.707107
sin(0.0) = 0.000000
sin(45.0) = 0.707107
sin(90.0) = 1.000000
sin(135.0) = 0.707107
sin(180.0) = 0.000000
関連 余弦は cos関数、正接は tan関数で求められる。
また、逆正弦を asin関数で求められる。
C99 においては、float型版の sinf関数、long double型版の sinl関数が存在する。
解説章

sinf関数

概要 正弦を計算する。
ヘッダ math.h
形式 float sinf(float x);
引数 x 求める角のラジアン値。
戻り値 引数x を角θのラジアン値としたときの正弦。
詳細 いわゆる三角関数のサインを求める関数である。
注意 実装方法によるが、誤差の度合いや、誤差の生まれ方の特徴は異なるので、許容できるかどうかはよく調べる必要がある。
使用例
#include <stdio.h>
#include <math.h>

#define DEG_TO_RAD(deg)  ((deg) / 180.0 * 3.14159265358979323846)  /* 度からラジアンへの変換 */

int main(void)
{
	float deg = -180.0f;
	int i;

	for( i = 0; i <= 8; ++i ){
		printf( "sin(%.1f) = %f\n", deg, sinf((float)DEG_TO_RAD(deg)) );
		deg += 45.0f;
	}

	return 0;
}

実行結果:

sin(-180.0) = -0.000000
sin(-135.0) = -0.707107
sin(-90.0) = -1.000000
sin(-45.0) = -0.707107
sin(0.0) = 0.000000
sin(45.0) = 0.707107
sin(90.0) = 1.000000
sin(135.0) = 0.707107
sin(180.0) = 0.000000
関連 double型版の sin関数、long double型版の sinl関数が存在する。
余弦は cosf関数、正接は tanf関数で、 逆正弦は asinf関数で求められる。
解説章

sinl関数

概要 正弦を計算する。
ヘッダ math.h
形式 long double sinl(long double x);
引数 x 求める角のラジアン値。
戻り値 引数x を角θのラジアン値としたときの正弦。
詳細 いわゆる三角関数のサインを求める関数である。
注意 実装方法によるが、誤差の度合いや、誤差の生まれ方の特徴は異なるので、許容できるかどうかはよく調べる必要がある。
使用例
#include <stdio.h>
#include <math.h>

#define DEG_TO_RAD(deg)  ((deg) / 180.0 * 3.14159265358979323846)  /* 度からラジアンへの変換 */

int main(void)
{
	long double deg = -180.0L;
	int i;

	for( i = 0; i <= 8; ++i ){
		printf( "sin(%.1Lf) = %Lf\n", deg, sinl(DEG_TO_RAD(deg)) );
		deg += 45.0L;
	}

	return 0;
}

実行結果:

sin(-180.0) = -0.000000
sin(-135.0) = -0.707107
sin(-90.0) = -1.000000
sin(-45.0) = -0.707107
sin(0.0) = 0.000000
sin(45.0) = 0.707107
sin(90.0) = 1.000000
sin(135.0) = 0.707107
sin(180.0) = 0.000000
関連 float型版の sinf関数、double型版の sin関数が存在する。
余弦は cosl関数、正接は tanl関数で、 逆正弦は asinl関数で求められる。
解説章

size_t

概要 サイズ型。
ヘッダ stddef.h
形式 typedef unsigned int size_t;
詳細 符号無しの整数型。 基本的には、sizeof演算子が返す結果の型だが、その他にも様々な関数で使用されている。
注意 この型の大きさは、環境によって異なる。
使用例
#include <stdio.h>
#include <stddef.h>

int main(void)
{
	printf("%lu\n", sizeof(size_t));

	return 0;
}

実行結果 (VisualC++ 2013/2015/2017):

4

実行結果 (Xcode 8.3.3):

8
関連 C99 には、size_t型で表現できる最大値を表す SIZE_MAXマクロがある。
解説章 第20章

SIZE_MAX

概要 size_t型で表現できる最大値。
ヘッダ stdint.h
形式 #define SIZE_MAX 4294967295
置換結果 size_t型で表現できる最大値。 size_t型の大きさは、コンパイラによって異なるので、このマクロの置換結果も一定ではない。
詳細
注意
使用例
#include <stdio.h>
#include <stdint.h>

int main(void)
{
	printf("%llu\n", SIZE_MAX);

	return 0;
}

実行結果 (VisualC++ 2013/2015/2017):

4294967295

実行結果 (Xcode 8.3.3):

18446744073709551615
関連
解説章

snprintf関数

概要 フォーマット指定された文字列を格納する。
ヘッダ stdio.h
形式 int snprintf(char* s, size_t n, const char* format, ...);
引数 s 結果を格納するアドレス。
n 終端に書き込まれる '\0' を含めた、格納する最大文字数。
format フォーマット指定を含んだ、あるいは含まないプレーンな文字列。
... format に含まれているフォーマット指定子に対応した個数のパラメータ。
戻り値 正常終了した場合、引数n よりも書き込まれた文字数('\0' を除く)の方が少ない場合は、 書き込まれた文字数を返す。これは、内容がすべて収まったことを示す。 引数n の方が小さく、収まりきらなかった場合は、必要だった長さ(やはり '\0' の分は除く)を返す。
エラーが発生した場合には負数を返す。
詳細 引数n で指定した文字数 - 1 の文字列が格納され、末尾に '\0' が付加される。
引数 n が 0 の場合、'\0' も含めて、何も書き込まれない。 この場合、引数 s は NULL であっても構わない。
注意 必要な個数の実引数が指定されていない場合の動作は未定義。 余分に指定されている場合には、評価は行われるが、snprintf関数としては無視する。
VisualC++ 2013 では使用できない。 代わりに、Microsoft拡張の _snprintf関数が存在しているが、書き込もうとする文字数が、 第2引数で指定した文字数以上のときには、末尾の '\0' が書き込まれないという違いがあり、 単純に置き換えることはできない。
使用例
// VisualC++ 2013 ではコンパイルできない
#include <stdio.h>

int main(void)
{
	char str[10];
	int n;
	
	n = snprintf(str, sizeof(str), "%d", 12345);
	if( n < 0 ) {
		fputs("error\n", stderr);
	}
	else if( n >= sizeof(str) ){
		puts("truncated");
	}
	else{
		puts(str);
	}

	n = snprintf(str, sizeof(str), "%d", 1234567890);
	if( n < 0 ){
		fputs("error\n", stderr);
	}
	else if( n >= sizeof(str) ){
		puts("truncated");
	}
	else{
		puts(str);
	}

	return 0;
}

実行結果:

12345
truncated
関連 命名規則が合致していないが、ワイド文字版は swprintf関数である。
引数... の代わりに、va_list を用いたバージョンとして、vsnprintf関数がある。
解説章

sprintf関数

概要 フォーマット指定された文字列を格納する。
ヘッダ stdio.h
形式 int sprintf(char* s, const char* format, ...);
引数 s 結果を格納するアドレス。
format フォーマット指定を含んだ、あるいは含まないプレーンな文字列。
... format に含まれているフォーマット指定子に対応した個数のパラメータ。
戻り値 エラーが発生した場合には負数を返す。 正常終了した場合には 0以上の値を返す。
詳細 結果を文字列へ格納することを除き、printf関数と同様であり、同じ機能を持つ。
文字列s の末尾には、自動的に '\0' が付加される。
注意 必要な個数の実引数が指定されていない場合の動作は未定義だが、 余分に指定されている場合には、評価は行われるが、sprintf関数としては無視する。
printf関数と異なり、文字列へ格納するという事情から、バッファオーバーフローの可能性を配慮しなければならない。
使用例
#include <stdio.h>

int main(void)
{
	char str[20];

	sprintf( str, "%d %3d %03d", 10, 10, 10 );
	puts( str );

	return 0;
}

実行結果:

10  10 010
関連 標準出力へ同様のフォーマット指定を行い出力するには、printf関数を使う。 任意のストリームに対して出力するには、fprintf関数を使う。
実引数... の代わりに、va_list を用いたバージョンとして、vsprintf関数がある。
C95規格からは、ワイド文字に対応した swprintf関数が追加されている。
C99規格からは、文字数の上限を指定できるようになり、安全性が高まった snprintf関数が追加されている。
解説章

sqrt関数

概要 平方根を求める。
ヘッダ math.h
形式 double sqrt(double x);
引数 x 対象の値。
戻り値 引数x の正の平方根。
詳細 平方根を求める。正負ともに解が存在するが、正の方が返される。
注意 負の数に対する平方根は存在しないので、引数x は 0以上でなければならない。 負数を渡した場合、戻り値は不定であり、errnoEDOM がセットされる。
使用例
#include <stdio.h>
#include <math.h>

int main(void)
{
	printf( "%f\n", sqrt(4.0) );
	printf( "%f\n", sqrt(100.0) );
	printf( "%f\n", sqrt(0.0) );

	return 0;
}

実行結果

2.000000
10.000000
0.000000
関連 C99 で、float型版の sqrtf関数、long double型版の sqrtl関数が追加された。
なお、べき乗は pow関数で求められる。
解説章

sqrtf関数

概要 平方根を求める。
ヘッダ math.h
形式 float sqrt(float x);
引数 x 対象の値。
戻り値 引数x の正の平方根。
詳細 平方根を求める。正負ともに解が存在するが、正の方が返される。
注意 負の数に対する平方根は存在しないので、引数x は 0以上でなければならない。 負数を渡した場合、戻り値は不定であり、errnoEDOM がセットされる。
使用例
#include <stdio.h>
#include <math.h>

int main(void)
{
	printf( "%f\n", sqrtf(4.0f) );
	printf( "%f\n", sqrtf(100.0f) );
	printf( "%f\n", sqrtf(0.0f) );

	return 0;
}

実行結果

2.000000
10.000000
0.000000
関連 double型版の sqrt関数、long double型版の sqrtl関数がある。
また、cbrtf関数で立方根を求めることができる。
なお、べき乗は powf関数で求められる。
解説章

sqrtl関数

概要 平方根を求める。
ヘッダ math.h
形式 long double sqrtl(long double x);
引数 x 対象の値。
戻り値 引数x の正の平方根。
詳細 平方根を求める。正負ともに解が存在するが、正の方が返される。
注意 負の数に対する平方根は存在しないので、引数x は 0以上でなければならない。 負数を渡した場合、戻り値は不定であり、errnoEDOM がセットされる。
使用例
#include <stdio.h>
#include <math.h>

int main(void)
{
	printf( "%Lf\n", sqrtl(4.0L) );
	printf( "%Lf\n", sqrtl(100.0L) );
	printf( "%Lf\n", sqrtl(0.0L) );

	return 0;
}

実行結果

2.000000
10.000000
0.000000
関連 double型版の sqrt関数、float型版の sqrtf関数がある。
また、cbrtl関数で立方根を求めることができる。
なお、べき乗は powl関数で求められる。
解説章

srand関数

概要 擬似乱数の種を設定する。
ヘッダ stdlib.h
形式 void srand(unsigned int seed);
引数 seed 乱数の種。
戻り値
詳細 rand関数が返す擬似乱数の元となる値(乱数の種)を設定する。 乱数の種に応じて、その後 rand関数を呼び出すたびに返される値が異なる。 srand関数を呼び出すことなく、rand関数を呼び出した場合は、srand(1); を呼び出した場合と同じ結果を生む。
注意
使用例
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
	int i;

	srand( (unsigned int)time(NULL) );

	for( i = 0; i < 20; ++i ){
		printf( "%d\n", rand() );
	}

	return 0;
}

実行結果

24581
7509
3789
26783
4399
29529
32633
12466
5097
24208
22247
1387
4598
18428
26406
2410
6408
26077
12162
6298
関連
解説章 第51章

sscanf関数

概要 文字列から、フォーマット指定付きで文字列を受け取る。
ヘッダ stdio.h
形式 int sscanf(const char* s, const char* format, ...);
引数 s 入力文字列。
format フォーマット指定文字列。
... 入力された値を受け取るアドレスの指定。 format に含まれているフォーマット指定子に対応した個数と型であること。
戻り値 エラーが発生した場合には EOF を返す。 その他の場合には、正常に値の代入を行えた個数を返す。
詳細 結果を文字列から受け取ることを除き、scanf関数と同様であり、同じ機能を持つ。
注意 必要な個数の実引数が指定されていない場合の動作は未定義だが、 余分に指定されている場合には、評価は行われるが、sscanf関数としては無視する。
使用例
#include <stdio.h>

int main(void)
{
	const char s[] = "100 abc 2.5";

	int num;
	char str[10];
	double f;

	sscanf( s, "%d %s %lf", &num, str, &f );
	printf( "%d %s %f\n", num, str, f );

	return 0;
}

実行結果:

100 abc 2.500000
関連 任意のストリームに対して同様のフォーマット指定を行い入力を受け取るには、fscanf関数を使う。 対象が標準入力の場合は、scanf関数が使える。
実引数... の代わりに、va_list を用いたバージョンとして、vscanf関数がある。
C95規格からは、ワイド文字に対応した wscanf関数が追加されている。
解説章 第7章

stderr

概要 標準エラーストリームを表す。
ヘッダ stdio.h
形式 extern FILE __streams[FOPEN_MAX];
#define stderr &__streams[2];
置換結果 プログラム実行開始直後に、自動的にオープンされる標準エラーストリームを表している、ファイル構造体へのポインタ。
ファイル構造体変数がどのように定義されているかは定まっていない。
詳細 標準エラーストリームは、プログラム実行開始時に自動的にオープンされる。
一般的には、バッファリングされていない。 バッファリングについては、setbuf関数setvbuf関数で設定を変更できる可能性がある。
注意 静的に存在する変数のアドレスに置換されているだけであっても、代入によって書き換えるべきではない。 結び付けるストリームを変更したければ freopen関数を使う。
使用例
#include <stdio.h>

int main(void)
{
	fputs( "Test Message\n", stderr );

	return 0;
}

実行結果:

Test Message
関連 標準入力は stdin、標準出力は stdout で表される。
errno に対するエラーメッセージを標準エラーに出力する目的で perror関数が使用できる。
解説章 第39章

stdin

概要 標準入力ストリームを表す。
ヘッダ stdio.h
形式 extern FILE __streams[FOPEN_MAX];
#define stdin &__streams[0];
置換結果 プログラム実行開始直後に、自動的にオープンされる標準入力ストリームを表しているファイル構造体へのポインタ。
ファイル構造体変数がどのように定義されているかは定まっていない。
詳細 標準入力ストリームは、プログラム実行開始時に自動的にオープンされる。
一般的には、バッファリングされている。 バッファリングについては、setbuf関数setvbuf関数で設定を変更できる可能性がある。
注意 静的に存在する変数のアドレスに置換されているだけであっても、代入によって書き換えるべきではない。 結び付けるストリームを変更したければ freopen関数を使う。
使用例
#include <stdio.h>

int main(void)
{
	char buf[80];

	fgets( buf, sizeof(buf), stdin );
	fputs( buf, stdout );

	return 0;
}

実行結果:

abcde
abcde
関連 標準出力は stdout、標準エラーは stderr で表される。
解説章 第6章

stdout

概要 標準出力ストリームを表す。
ヘッダ stdio.h
形式 extern FILE __streams[FOPEN_MAX];
#define stderr &__streams[1];
置換結果 プログラム実行開始直後に、自動的にオープンされる標準出力ストリームを表しているファイル構造体へのポインタ。
ファイル構造体変数がどのように定義されているかは定まっていない。
詳細 標準出力ストリームは、プログラム実行開始時に自動的にオープンされる。
一般的には、バッファリングされている。 バッファリングについては、setbuf関数setvbuf関数で設定を変更できる可能性がある。
注意 静的に存在する変数のアドレスに置換されているだけであっても、代入によって書き換えるべきではない。 結び付けるストリームを変更したければ freopen関数を使う。
使用例
#include <stdio.h>

int main(void)
{
	fputs( "Test Message\n", stdout );

	return 0;
}

実行結果:

Test Message
関連 標準入力は stdin、標準エラーは stderr で表される。
解説章

strcat関数

概要 文字列を連結する。
ヘッダ string.h
形式 char* strcat(char* s1, const char* s2);
引数 s1 連結先の文字列。
s2 連結元の文字列。
戻り値 s1 と同じアドレスを返す。
詳細 s1 の末尾に s2 を連結する。
注意 s1 が指す配列に、連結後の文字列を許容できるだけの大きさが必要である。 不足していた場合の動作は未定義である。
連結結果が含まれる範囲と、連結元の範囲とが重複していた場合の動作は未定義である。
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s[80];

	strcpy( s, "abcde" );
	puts( strcat( s, "fghij" ) );
	puts( s );

	return 0;
}

実行結果:

abcdefghij
abcdefghij
関連 連結する文字数を指定できる strncat関数もある。
文字列が wchar_t型で表現される場合、wcscat関数で比較する。これは C95以降で使える。
解説章

strchr関数

概要 文字列から、特定の文字を探す。
ヘッダ string.h
形式 char* strchr(const char* s, int c);
引数 s 対象の文字列。
c 探す文字。
戻り値 発見された場合は、文字列s 中の文字c を指すポインタ。
発見できなかった場合は NULL
詳細 文字列s の先頭から検索を行い、引数c を char型にキャストしたものと一致する文字を探す。
文字列s の終端にある '\0' についても、検索対象に含まれる。
注意 検索対象の文字列s は const であるのにも関わらず、戻り値は非const のポインタである。 そのため、const指定されている文字列を対象にした場合、返されたポインタを経由して書き換えを行うことは未定義の動作である。
(C++ では、const指定の扱いが厳しくなっているため、この関数は const版と非const版にオーバーロードされていることがある)。
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	char* p;

	p = strchr( "abcdef", 'd' );
	if( p == NULL ){
		puts( "見つからない。" );
	}
	else{
		puts( p );
	}

	return 0;
}

実行結果:

def
関連 文字列の末尾から逆方向に検索する strrchr関数がある。
C95以降では、ワイド文字版の wcschr関数がある。
また、文字列ではなく、メモリ上のバイト列を対象とした memchr関数がある。
文字列を探す場合は、strstr関数を使う。
解説章 第38章(練習問題F)

strcmp関数

概要 文字列を比較する。
ヘッダ string.h
形式 int strcmp(const char* s1, const char* s2);
引数 s1 比較対象の文字列。
s2 比較対象の文字列。
戻り値 辞書順で s1 の方が小さければ(前に来れば) 0 より小さい値が、
s1 の方が大きければ(後に来れば) 0 より大きい値が、
s1 と s2 が同じであれば 0 が返される。
詳細
注意 引数に空文字列"" を渡しても構わないが、NULL を渡してはならない。
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	printf( "%d\n", strcmp("abc","abc") );
	printf( "%d\n", strcmp("abc","ab") );
	printf( "%d\n", strcmp("abc","abc123") );

	return 0;
}

実行結果:

0
1
-1
関連 strncmp関数は、比較する文字数を指定できる。
文字列が wchar_t型で表現される場合、wcscmp関数で比較する。これは C95以降で使える。
文字列ではなく、メモリ上のバイト列を比較するには memcmp関数を使う。
解説章 第11章

strcoll関数

strcpy関数

概要 文字列をコピーする。
ヘッダ string.h
形式 char* strcpy(char* s1, const char* s2);
引数 s1 コピー先の文字列。
s2 コピー元の文字列。
戻り値 s1 と同じアドレス。
詳細 s1 に s2 をコピーする。
注意 s1 の指す配列の容量よりも、s2 の長さの方が大きい場合の動作は未定義である。
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s[20];

	puts( strcpy( s, "abcde" ) );

	return 0;
}

実行結果:

abcde
関連 strncpy関数は、コピーする文字数を指定できる。
文字列が wchar_t型で表現される場合、wcscpy関数で比較する。これは C95以降で使える。
文字列ではなく、メモリ上のバイト列をコピーするには memcpy関数、あるいは memmove関数を使う。
解説章 第25章第32章(練習問題@)

strerror関数

概要 エラーメッセージの文字列を取得する。
ヘッダ string.h
形式 char* strerror(int errnum);
引数 errnum エラー番号。
戻り値 引数errnum に対応するエラーメッセージの文字列へのポインタ。
詳細
注意 エラーメッセージの内容は、環境に応じて異なる。
返されたポインタを経由して、文字列を書き換えてはならない。
使用例
#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(void)
{
	puts( strerror(0) );
	puts( strerror(ERANGE) );
	return 0;
}

実行結果:

No error
Result too large
関連
解説章

strftime

概要 現在のロケールに応じた日時と時刻を表す文字列を返す。
ヘッダ time.h
形式 size_t strftime(char* s, size_t maxsize, const char* format, const struct tm* t);
引数 s 結果を格納する文字配列へのポインタ。
maxsize 結果の文字列の最大長。
format フォーマット指定文字列。
t 日付・時刻の情報が格納された tm構造体へのポインタ。
戻り値 結果の文字列の長さ。
詳細 引数t が指す tm構造体のメンバの値を使って、 現在のロケールの LC_TIMEカテゴリに応じた、日付・時刻の文字列を生成する。
引数format は、「%」で始まる文字の並びによって変換指令を与える。 通常は、「%」と、それに続く1文字の変換指令文字の組み合わせである。
「%」と変換指令文字の間に、「E」または「O」を挟み込むことで、変換方法を変えるように指示することができる。 ただし、この指示が具体的などのような意味を持つかは規定されておらず、環境依存である。
変換指令文字は、以下のものがある。
変換指令文字 参照するメンバ 意味
a tm_wday 曜日名の短縮形式
A tm_wday 曜日名
b tm_mon 月名の短縮形式
B tm_mon 月名
c いずれか 日付と時刻
C (C99) tm_year 西暦年の下2桁
d tm_mday
D (C99) tm_mon、tm_mday、tm_year "%m/%d/%y" と同じ
e tm_mday 日。1桁の場合、手前に空白文字を付加。
F tm_mon、tm_mday、tm_year "%Y-%m-%d" と同じ
g tm_year、tm_wday、tm_yday 週基準年の下2桁
G tm_year、tm_wday、tm_yday 週基準年
h tm_mon "%b" と同じ
H tm_hour 24時間表記での「時」
I tm_hour 12時間表記での「時」
j tm_yday 年の初めからの通年日
m tm_mon
M tm_min
n (C99) なし 改行
P tm_hour 午前・午後の区別を表す表現
r (C99) tm_hour、tm_min、tm_sec 12時間表記による時・分・秒の表現
R (C99) tm_hour、tm_min "%H:%M" と同じ
S tm_sec
t (C99) なし 水平タブ
T (C99) tm_hour、tm_min、tm_sec "%H:%M:%S" と同じ
u (C99) tm_wday 曜日を数値で表したもの (基準は月曜日で 1)
U tm_year、tm_wday、tm_yday その年の何週目か。
最初の日曜日を 1週目とし、年初めの日曜日が現れるより前の日は 0 になる。
V (C99) tm_year、tm_wday、tm_yday その年の何週目か。
最初の月曜日を 1週目とし、年初めの月曜日が現れるより前の日は、前年の最終週に含むと考える。 そのため、「U」や「W」と違い、0 にはなり得ない。
w tm_wday 曜日を数値で表したもの (基準は日曜日で 0)
W tm_year、tm_wday、tm_yday その年の何週目か。
最初の月曜日を 1週目とし、年初めの月曜日が現れるより前の日は 0 になる。
x いずれか 日付(年・月・日)の表現
X いずれか 時刻(時・分・秒)の表現
y tm_year 西暦年の下2桁
Y tm_year 西暦年
z (C99) tm_isdst UTC (協定世界時) からの時差。
例えば、「-330」は 3時間30分遅れていることを表す。 時間帯が不明なときは "" になる。
Z tm_isdst 時間帯名。
時間帯が不明なときは "" になる。
% なし %

表の中で登場する「週基準年」とは、ISO 8601 で規定されている定義で、 週の始まりを月曜日とし、1月4日を含んでいる週を、その年の第1週と考える。

注意
使用例
#include <stdio.h>
#include <locale.h>
#include <time.h>

#if defined(_MSC_VER)
static const char* LOCALE_NAME[] = {"ja-JP", "en-US"};
#elif defined(__clang__)
static const char* LOCALE_NAME[] = {"ja_JP", "en_US"};
#endif

int main(void)
{
	time_t now;
	struct tm* t;
	char str[256];
	
	now = time( NULL );
	t = localtime( &now );

	puts( setlocale( LC_TIME, LOCALE_NAME[0] ) );
	strftime( str, sizeof(str), "%x %X", t );
	puts( str );

	puts( setlocale( LC_TIME, LOCALE_NAME[1] ) );
	strftime( str, sizeof(str), "%x %X", t );
	puts( str );

	return 0;
}

実行結果 (VisualC++):

ja-JP
2017/05/23 11:56:41
en-US
5/23/2017 11:56:41 AM

実行結果 (Xcode):

ja_JP
2017/05/23 11時56分41秒
en_US
05/23/2017 11:56:41
関連 C95 で、ワイド文字列版の wcsftime関数が追加されている。
解説章

strlen関数

概要 文字列の長さを調べる。
ヘッダ string.h
形式 size_t strlen(const char* s);
引数 s 対象の文字列。
戻り値 文字列s の長さ(文字数)
詳細 末尾の '\0' を含めない長さを調べる。空文字列"" の場合は 0 を返す。
注意 "abc\0def" のように、途中に '\0' を含む場合、途中の '\0' までの長さ(この場合 3)が結果として返される。
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	printf( "%d\n", (int)strlen("abcdef") );

	return 0;
}

実行結果:

6
関連 文字列が wchar_t型で表現される場合、wcslen関数を使う。これは C95以降で使える。
解説章 第32章

strncat関数

概要 文字列を連結する。
ヘッダ string.h
形式 char* strncat(char* s1, const char* s2, size_t n);
引数 s1 連結先の文字列。
s2 連結元の文字列。
n 連結する文字数。
戻り値 s1 と同じアドレスを返す。
詳細 s1 の末尾に s2 を n文字分だけ連結する。
s2 に含まれている文字数が、n に満たない場合は、s2 の末尾までが連結される。
n文字分の連結を終えた後、s1 の末尾には '\0' が付加される。
注意 s1 が指す配列に、連結後の文字列を許容できるだけの大きさが必要である。 不足していた場合の動作は未定義である。 結果として s1 には、「元の s1 の文字数+ n + 1」の要素数が必要である。
連結結果が含まれる範囲と、連結元の範囲とが重複していた場合の動作は未定義である。
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s[80];

	strcpy( s, "abcde" );
	puts( strncat( s, "fghij", 3 ) );
	puts( s );

	return 0;
}

実行結果:

abcdefgh
abcdefgh
関連 文字列が wchar_t型で表現される場合、wcsncat関数で比較する。これは C95以降で使える。
解説章

strncmp関数

概要 文字列を比較する。
ヘッダ string.h
形式 int strncmp(const char* s1, const char* s2, size_t n);
引数 s1 比較対象の文字列。
s2 比較対象の文字列。
n 比較する文字数。
戻り値 辞書順で s1 の方が小さければ(前に来れば) 0 より小さい値が、
s1 の方が大きければ(後に来れば) 0 より大きい値が、
s1 と s2 が同じであれば 0 が返される。
なお、n が 0 のときの結果は常に 0 になる。
詳細 s1 と s2 を、先頭から n文字数分だけ比較する。
注意 引数に空文字列"" を渡しても構わないが、NULL を渡してはならない。
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	printf( "%d\n", strncmp("abcde","abc", 3) );
	printf( "%d\n", strncmp("abcde","ab", 3 ) );
	printf( "%d\n", strncmp("abcde","abc123", 3) );

	return 0;
}

実行結果:

0
1
0
関連 文字列が wchar_t型で表現される場合、wcsncmp関数で比較する。これは C95以降で使える。
文字列ではなく、メモリ上のバイト列を比較するには memcmp関数を使う。
解説章

strncpy関数

概要 文字列をコピーする。
ヘッダ string.h
形式 char* strncpy(char* s1, const char* s2, size_t n);
引数 s1 コピー先の文字列。
s2 コピー元の文字列。
n コピーする文字数。
戻り値 s1 と同じアドレス。
詳細 s1 に s2 を n文字だけコピーする。
n が 0 のときは何も起こらない。
注意 s1 の指す配列の容量よりも、s2 の長さの方が大きい場合の動作は未定義である。
s2 の文字数が n に満たない場合には、s2 の内容がコピーされた後、更に '\0' が付加される。 しかし、s2 の文字数が n以上ある場合、n文字分がコピーされるため、末尾の '\0' が付加されない。
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s1[10];
	char s2[10];

	puts( strncpy( s1, "abcde", 7 ) );
	puts( strncpy( s2, "abcde", 3 ) );  /* s2 の末尾に '\0' が付かないので危険 */

	return 0;
}

実行結果:

abcde
abcフフフフフフフフフフフフフフフフフabcde
関連 文字列が wchar_t型で表現される場合、wcsncpy関数で比較する。これは C95以降で使える。
文字列ではなく、メモリ上のバイト列をコピーするには memcpy関数、あるいは memmove関数を使う。
解説章

strrchr関数

概要 文字列の後方から、特定の文字を探す。
ヘッダ string.h
形式 char* strrchr(const char* s, int c);
引数 s 対象の文字列。
c 探す文字。
戻り値 発見された場合は、文字列s 中の文字c を指すポインタ。
発見できなかった場合は NULL
詳細 文字列s の末尾から検索を行い、引数c を char型にキャストしたものと一致する文字を探す。
文字列s の終端にある '\0' についても、検索対象に含まれる。
注意 検索対象の文字列s は const であるのにも関わらず、戻り値は非const のポインタである。 そのため、const指定されている文字列を対象にした場合、返されたポインタを経由して書き換えを行うことは未定義の動作である。
(C++ では、const指定の扱いが厳しくなっているため、この関数は const版と非const版にオーバーロードされていることがある)。
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	char* p;

	p = strrchr( "abcabc", 'a' );
	if( p == NULL ){
		puts( "見つからない。" );
	}
	else{
		puts( p );
	}

	return 0;
}

実行結果:

abc
関連 文字列の先頭から順方向に検索する strchr関数がある。
C95以降では、ワイド文字版の wcsrchr関数がある。
解説章

strstr関数

概要 文字列から、特定の文字列を探す。
ヘッダ string.h
形式 char* strstr(const char* s1, const char* s2);
引数 s1 対象の文字列。
s2 探す文字列。
戻り値 発見された場合は、文字列s1 中にある文字列s2 と同じ並びの先頭を指すポインタ。
発見できなかった場合は NULL
詳細 文字列s1 の先頭から検索を行い、s2 と同じ並びを探す。 s2 が空文字列"" である場合、s1 の先頭のアドレスが返される。
注意 検索対象の文字列s1 は const であるのにも関わらず、戻り値は非const のポインタである。 そのため、const指定されている文字列を対象にした場合、返されたポインタを経由して書き換えを行うことは未定義の動作である。
(C++ では、const指定の扱いが厳しくなっているため、この関数は const版と非const版にオーバーロードされていることがある)。
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	char* p;

	p = strstr( "abcdcba", "cd" );
	if( p == NULL ){
		puts( "見つからない。" );
	}
	else{
		puts( p );
	}

	return 0;
}

実行結果:

cdcba
関連 C95以降では、ワイド文字版の wcsstr関数がある。
単独の文字を探す場合は strchr関数が使える。
解説章

strtod関数

概要 文字列を double型に変換する。
ヘッダ stdlib.h
形式 double strtod(const char* s, char** endptr);
引数 s 対象の文字列。
endptr 変換できない最初の文字へのポインタを受け取る変数のアドレス。 不要であれば NULL でも構わない。
戻り値 正常に変換された場合は、double型に変換された結果。
変換結果が、表現可能な範囲を超えている場合は、正しい結果が正ならば +HUGE_VAL、負ならば -HUGE_VAL が返され、 errnoERANGE が格納される。
変換結果が、アンダーフローを起こす場合には、C95 までは 0 を返し、C99以降では double型で最も小さな正規化された正の数以下の絶対値をもつ値を返す。 errno に ERANGE を格納する処理系もある。
最初の文字の時点ですでに変換不能な場合、0 が返される。
詳細 文字列を浮動小数点数とみなし、double型の値として返す。 浮動小数点数として認識できない文字に行き当たると、その文字を指すポインタを引数endptr が指すアドレスに渡す。 引数endptr が NULL の場合は、単に変換をその段階で中止する。
注意 エラーの有無は errno によって調べなければならない。 戻り値だけでの判定は不可能である。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>

int main(void)
{
	double d;
	char* s = NULL;

	errno = 0;
	d = strtod( "-51.3705abc", &s );
	if( errno != 0 ){
		fputs( "結果が表現できない\n", stderr );
		exit( EXIT_FAILURE );
	}

	printf( "%f\n", d );
	if( s != NULL ){
		puts( s );
	}

	return 0;
}

実行結果:

-51.370500
abc
関連 strtol関数は long型に、strtoul関数は unsigned long型に変換できる。 また、atoi関数atol関数atof関数はそれぞれ仕様が単純だが、エラー検出が行えない。
C99 の場合には更に、float型に変換する strtof関数、long double型に変換する strtold関数、long long型に変換する strtoll関数がある。
解説章 第45章

strtof関数

概要 文字列を float型に変換する。
ヘッダ stdlib.h
形式 float strtof(const char* s, char** endptr);
引数 s 対象の文字列。
endptr 変換できない最初の文字へのポインタを受け取る変数のアドレス。 不要であれば NULL でも構わない。
戻り値 正常に変換された場合は、float型に変換された結果。
変換結果が、表現可能な範囲を超えている場合は、正しい結果が正ならば +HUGE_VALF、負ならば -HUGE_VALF が返され、 errnoERANGE が格納される。
変換結果が、アンダーフローを起こす場合には、float型で最も小さな正規化された正の数以下の絶対値をもつ値を返す。 errno に ERANGE を格納する処理系もある。
最初の文字の時点ですでに変換不能な場合、0 が返される。
詳細 文字列を浮動小数点数とみなし、float型の値として返す。 浮動小数点数として認識できない文字に行き当たると、その文字を指すポインタを引数endptr が指すアドレスに渡す。 引数endptr が NULL の場合は、単に変換をその段階で中止する。
注意 エラーの有無は errno によって調べなければならない。 戻り値だけでの判定は不可能である。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>

int main(void)
{
	float d;
	char* s = NULL;

	errno = 0;
	d = strtof( "-50.7575abc", &s );
	if( errno != 0 ){
		fputs( "結果が表現できない\n", stderr );
		exit( EXIT_FAILURE );
	}

	printf( "%f\n", d );
	if( s != NULL ){
		puts( s );
	}

	return 0;
}

実行結果:

-50.757500
abc
関連 double型に変換する strtod関数、long double型に変換する strtold関数がある。
また、以下のように、整数型に変換する関数が幾つかある。 strtol関数は long型に、strtoul関数は unsigned long型に、 strtoll関数は long long型に、strtoull関数は unsigned long long型に、それぞれ変換する。
解説章 第45章

strtok関数

概要 文字列を分割する。
ヘッダ string.h
形式 char* strtok(char* str, const char* set);
引数 str 対象の文字列。2回目以降の呼び出し時には NULL を指定。
set 区切り文字を書き並べた文字列。
戻り値 区切り文字を発見した場合、その区切り文字の直後の文字を指すポインタが返される。 発見できなかった場合は NULL が返される。
詳細 まず前提として、この関数は何度も繰り返し呼び出すような使い方をすることを理解しておくべきである。
この関数の目的は、ある文字列を、一定の区切り文字ごとに分割することである。 例えば、"abc,defgh,ij" という文字列に対し、区切り文字を "," として与えれば、"abc"、"defgh"、"ij" を得られる。
1度目の呼び出しの際にだけ、引数str に対象となる文字列を指定する。 2度目以降は、前回の続きから調べるということを表すために引数str を NULL とする。 何度目の呼び出しであっても、戻り値の意味は同様であり、区切られた後の文字列の先頭アドレスが返される(これ以上区切れないときには NULL になる)。
したがって、1度目と、2度目以降とでは、引数str に与える内容は異なる。 引数set に関しては、その必要があれば呼び出しごとに異なっても構わない。
注意 関数内で、引数str が指す文字列は書き換えられることに注意(引数str には const修飾子が付いていない) 具体的には、区切り文字の部分が '\0' に書き換えられる。 こうして、戻り値として返されるアドレスが、引数str の指す文字列内のどこかに含まれ、かつ、終端に '\0' が適切に置かれていることが保証される。
繰り返し呼び出すような使い方を実現するため、この標準関数は、どこかに静的変数を用意しており、そこにこれまでに調べ終えた位置を記憶している。 そのため、同時に2つの異なる文字列を対象として、この関数が呼び出されるような使い方をしてはならない。
使用例
#include <stdio.h>
#include <string.h>

int main(void)
{
	char str[] = "abc,defgh,ij";
	const char* const separator = ",";
	char* token;


	token = strtok( str, separator );
	while( token != NULL ){
		puts( token );
		token = strtok( NULL, separator );
	}

	puts( "" );
	puts( "元の文字列が直接書き換えられていることを確認" );
	puts( str );

	return 0;
}

実行結果:

abc
defgh
ij

元の文字列が直接書き換えられていることを確認
abc
関連 C95 では、ワイド文字列に対応した wcstok関数が追加された。
解説章

strtol関数

概要 文字列を long型に変換する。
ヘッダ stdlib.h
形式 long int strtol(const char* s, char** endptr, int radix);
引数 s 対象の文字列。
endptr 変換できない最初の文字へのポインタを受け取る変数のアドレス。 不要であれば NULL でも構わない。
radix 2〜36 の範囲の基数。または 0。
戻り値 正常に変換された場合は、long型に変換された結果。
変換結果が、表現可能な範囲を超えている場合は、正しい結果が正ならば LONG_MAX、負ならば LONG_MIN が返され、 errnoERANGE が格納される。
変換が行われなかった場合、引数endptr が NULL でなければ、endptr の指すアドレスに、引数s がそのまま渡される。 この場合の戻り値は 0 になる。
詳細 引数radix が 2〜36 のいずれかであれば、文字列を、引数radix で指定した基数の整数とみなし、long型の値として返す。 引数radix が 0 の場合には、8進数、10進数、16進数のいずれかであるとみなし、やはり long型の値として返す。
数として認識できない文字に行き当たると、その文字を指すポインタを引数endptr が指すアドレスに渡す。 引数endptr が NULL の場合は、単に変換をその段階で中止する。
注意 エラーの有無は errno によって調べなければならない。 戻り値だけでの判定は不可能である。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>

int main(void)
{
	const char* str = "3050abc";
	long l;
	char* s = NULL;

	errno = 0;
	l = strtol( str, &s, 10 );
	if( (l == LONG_MIN || l == LONG_MAX) && errno == ERANGE ){
		fputs( "結果が表現できない\n", stderr );
		exit( EXIT_FAILURE );
	}
	else if( str == s ){
		fputs( "変換できなかった\n", stderr );
		exit( EXIT_FAILURE );
	}

	printf( "%ld\n", l );
	if( s != NULL ){
		puts( s );
	}

	return 0;
}

実行結果:

3050
abc
関連 strtod関数は double型に、strtoul関数は unsigned long型に変換できる。 また、atoi関数atol関数atof関数はそれぞれ仕様が単純だが、エラー検出が行えない。
C99 の場合には更に、float型に変換する strtof関数、long double型に変換する strtold関数、long long型に変換する strtoll関数がある。
解説章 第45章

strtold関数

概要 文字列を long double型に変換する。
ヘッダ stdlib.h
形式 long double strtold(const char* s, char** endptr);
引数 s 対象の文字列。
endptr 変換できない最初の文字へのポインタを受け取る変数のアドレス。 不要であれば NULL でも構わない。
戻り値 正常に変換された場合は、long double型に変換された結果。
変換結果が、表現可能な範囲を超えている場合は、正しい結果が正ならば +HUGE_VALL、負ならば -HUGE_VALL が返され、 errnoERANGE が格納される。
変換結果が、アンダーフローを起こす場合には、long double型で最も小さな正規化された正の数以下の絶対値をもつ値を返す。 errno に ERANGE を格納する処理系もある。
最初の文字の時点ですでに変換不能な場合、0 が返される。
詳細 文字列を浮動小数点数とみなし、long double型の値として返す。 浮動小数点数として認識できない文字に行き当たると、その文字を指すポインタを引数endptr が指すアドレスに渡す。 引数endptr が NULL の場合は、単に変換をその段階で中止する。
注意 エラーの有無は errno によって調べなければならない。 戻り値だけでの判定は不可能である。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>

int main(void)
{
	long double d;
	char* s = NULL;

	errno = 0;
	d = strtold( "-50.7575abc", &s );
	if( errno != 0 ){
		fputs( "結果が表現できない\n", stderr );
		exit( EXIT_FAILURE );
	}

	printf( "%Lf\n", d );
	if( s != NULL ){
		puts( s );
	}

	return 0;
}

実行結果:

-50.757500
abc
関連 float型に変換する strtof関数、double型に変換する strtod関数がある。
また、以下のように、整数型に変換する関数が幾つかある。 strtol関数は long型に、strtoul関数は unsigned long型に、 strtoll関数は long long型に、strtoull関数は unsigned long long型に、それぞれ変換する。
解説章 第45章

strtoll関数

概要 文字列を long long型に変換する。
ヘッダ stdlib.h
形式 long long int strtoll(const char* s, char** endptr, int radix);
引数 s 対象の文字列。
endptr 変換できない最初の文字へのポインタを受け取る変数のアドレス。 不要であれば NULL でも構わない。
radix 2〜36 の範囲の基数。または 0。
戻り値 正常に変換された場合は、long long型に変換された結果。
変換結果が、表現可能な範囲を超えている場合は、正しい結果が正ならば LLONG_MAX、負ならば LLONG_MIN が返され、 errnoERANGE が格納される。
変換が行われなかった場合、引数endptr が NULL でなければ、endptr の指すアドレスに、引数s がそのまま渡される。 この場合の戻り値は 0 になる。
詳細 引数radix が 2〜36 のいずれかであれば、文字列を、引数radix で指定した基数の整数とみなし、long long型の値として返す。 引数radix が 0 の場合には、8進数、10進数、16進数のいずれかであるとみなし、やはり long long型の値として返す。
数として認識できない文字に行き当たると、その文字を指すポインタを引数endptr が指すアドレスに渡す。 引数endptr が NULL の場合は、単に変換をその段階で中止する。
注意 エラーの有無は errno によって調べなければならない。 戻り値だけでの判定は不可能である。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>

int main(void)
{
	const char* str = "3050abc";
	long long l;
	char* s = NULL;

	errno = 0;
	l = strtoll( str, &s, 10 );
	if( (l == LLONG_MIN || l == LLONG_MAX) && errno == ERANGE ){
		fputs( "結果が表現できない\n", stderr );
		exit( EXIT_FAILURE );
	}
	else if( str == s ){
		fputs( "変換できなかった\n", stderr );
		exit( EXIT_FAILURE );
	}

	printf( "%lld\n", l );
	if( s != NULL ){
		puts( s );
	}

	return 0;
}

実行結果:

3050
abc
関連 strtod関数は double型に、strtoull関数は unsigned long long型に変換できる。 また、atoi関数atol関数atof関数はそれぞれ仕様が単純だが、エラー検出が行えない。
C99 の場合には更に、float型に変換する strtof関数、 long double型に変換する strtold関数、long型に変換する strtol関数がある。
解説章 第45章

strtoul関数

概要 文字列を unsigned long型に変換する。
ヘッダ stdlib.h
形式 unsigned long int strtoul(const char* s, char** endptr, int radix);
引数 s 対象の文字列。
endptr 変換できない最初の文字へのポインタを受け取る変数のアドレス。 不要であれば NULL でも構わない。
radix 2〜36 の範囲の基数。または 0。
戻り値 正常に変換された場合は、unsigned long型に変換された結果。
変換結果が、表現可能な範囲を超えている場合は、ULONG_MAX が返され、 errnoERANGE が格納される。
変換が行われなかった場合、引数endptr が NULL でなければ、endptr の指すアドレスに、引数s がそのまま渡される。 この場合の戻り値は 0 になる。
詳細 引数radix が 2〜36 のいずれかであれば、文字列を、引数radix で指定した基数の整数とみなし、unsigned long型の値として返す。 引数radix が 0 の場合には、8進数、10進数、16進数のいずれかであるとみなし、やはり unsigned long型の値として返す。
数として認識できない文字に行き当たると、その文字を指すポインタを引数endptr が指すアドレスに渡す。 引数endptr が NULL の場合は、単に変換をその段階で中止する。
注意 エラーの有無は errno によって調べなければならない。 戻り値だけでの判定は不可能である。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>

int main(void)
{
	const char* str = "3050abc";
	unsigned long u;
	char* s = NULL;

	errno = 0;
	u = strtoul( str, &s, 10 );
	if( u == ULONG_MAX && errno == ERANGE ){
		fputs( "結果が表現できない\n", stderr );
		exit( EXIT_FAILURE );
	}
	else if( str == s ){
		fputs( "変換できなかった\n", stderr );
		exit( EXIT_FAILURE );
	}

	printf( "%lu\n", u );
	if( s != NULL ){
		puts( s );
	}

	return 0;
}

実行結果:

3050
abc
関連 strtod関数は double型に、strtol関数は long型に変換できる。 また、atoi関数atol関数atof関数はそれぞれ仕様が単純だが、エラー検出が行えない。
C99 の場合には更に、float型に変換する strtof関数、long double型に変換する strtold関数、long long型に変換する strtoll関数がある。
解説章 第45章

strtoull関数

概要 文字列を unsigned long long型に変換する。
ヘッダ stdlib.h
形式 unsigned long long int strtoull(const char* s, char** endptr, int radix);
引数 s 対象の文字列。
endptr 変換できない最初の文字へのポインタを受け取る変数のアドレス。 不要であれば NULL でも構わない。
radix 2〜36 の範囲の基数。または 0。
戻り値 正常に変換された場合は、unsigned long long型に変換された結果。
変換結果が、表現可能な範囲を超えている場合は、ULLONG_MAX が返され、 errnoERANGE が格納される。
変換が行われなかった場合、引数endptr が NULL でなければ、endptr の指すアドレスに、引数s がそのまま渡される。 この場合の戻り値は 0 になる。
詳細 引数radix が 2〜36 のいずれかであれば、文字列を、引数radix で指定した基数の整数とみなし、unsigned long long型の値として返す。 引数radix が 0 の場合には、8進数、10進数、16進数のいずれかであるとみなし、やはり unsigned long long型の値として返す。
数として認識できない文字に行き当たると、その文字を指すポインタを引数endptr が指すアドレスに渡す。 引数endptr が NULL の場合は、単に変換をその段階で中止する。
注意 エラーの有無は errno によって調べなければならない。 戻り値だけでの判定は不可能である。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>

int main(void)
{
	const char* str = "3050abc";
	unsigned long long u;
	char* s = NULL;

	errno = 0;
	u = strtoull( str, &s, 10 );
	if( u == ULLONG_MAX && errno == ERANGE ){
		fputs( "結果が表現できない\n", stderr );
		exit( EXIT_FAILURE );
	}
	else if( str == s ){
		fputs( "変換できなかった\n", stderr );
		exit( EXIT_FAILURE );
	}

	printf( "%llu\n", u );
	if( s != NULL ){
		puts( s );
	}

	return 0;
}

実行結果:

3050
abc
関連 strtod関数は double型に、strtoll関数は long long型に変換できる。 また、atoi関数atol関数atof関数はそれぞれ仕様が単純だが、エラー検出が行えない。
C99 の場合には更に、float型に変換する strtof関数、long double型に変換する strtold関数、long型に変換する strtol関数がある。
解説章 第45章

strxfrm関数

swprintf関数

概要 フォーマット指定されたワイド文字列を格納する。
ヘッダ stdio.h、wchar.h
形式 int swprintf(wchar_t* s, size_t n, const wchar_t* format, ...);
引数 s 結果を格納するアドレス。
n 終端に書き込まれる L'\0' を含めた、格納する最大文字数。
format フォーマット指定を含んだ、あるいは含まないプレーンな文字列。
... format に含まれているフォーマット指定子に対応した個数のパラメータ。
戻り値 エラーが発生した場合には負数を返す。 正常終了した場合には 0以上の値を返す。
詳細 引数n で指定した文字数 - 1 の文字列が格納され、末尾に L'\0' が付加される。
引数 n が 0 の場合、L'\0' も含めて、何も書き込まれない。
注意 引数n は文字数であって、バイト数では無いので、sizeof を使って計算する場合には注意が必要である。
必要な個数の実引数が指定されていない場合の動作は未定義。 余分に指定されている場合には、評価は行われるが、swprintf関数としては無視する。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	wchar_t str[10];

	swprintf( str, sizeof(str) / sizeof(wchar_t), L"%d", 1234567890 );
	wprintf( L"%ls\n", str );

	return 0;
}

実行結果:

123456789
関連 命名規則が合致していないが、マルチバイト文字版は snprintf関数である。 ただし、C99以降でなければ存在しないので、 C95 の時点では、上限文字数の指定ができない sprintf関数を注意して使う必要がある。
引数... の代わりに、va_list を用いたバージョンとして、vswprintf関数がある。
解説章

swscanf関数

概要 ワイド文字列から、フォーマット指定付きでワイド文字列を受け取る。
ヘッダ wchar.h
形式 int swscanf(const wchar_t* s, const wchar_t* format, ...);
引数 s 入力文字列。
format フォーマット指定文字列。
... 入力された値を受け取るアドレスの指定。 format に含まれているフォーマット指定子に対応した個数と型であること。
戻り値 エラーが発生した場合には EOF を返す。 その他の場合には、正常に値の代入を行えた個数を返す。
詳細 結果を文字列から受け取ることを除き、scanf関数と同様であり、同じ機能を持つ。
注意 必要な個数の実引数が指定されていない場合の動作は未定義だが、 余分に指定されている場合には、評価は行われるが、swscanf関数としては無視する。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	const wchar_t s[] = L"100 abc 2.5";

	int num;
	char str[10];
	double f;

	swscanf( s, L"%d %s %lf", &num, str, &f );
	printf( "%d %s %f\n", num, str, f );

	return 0;
}

実行結果:

100 abc 2.500000
関連 char型を使う sscanf関数がある。
解説章

system関数

概要 コマンドプロセッサへ文字列を引き渡す。
ヘッダ stdlib.h
形式 int system(const char* s);
引数 s コマンドプロセッサへ渡す文字列。
NULL を指定した場合は、コマンドプロセッサが存在するかどうかを確認するという意味合いになる。
戻り値 引数s が NULL でない場合には、環境ごとに異なる意味を持った値を返す。
引数s が NULL の場合には、コマンドプロセッサが存在すれば 0以外の値、存在しなければ 0 を返す。
詳細 文字列をコマンドプロセッサへ渡す。 コマンドプロセッサが存在するかどうか、どのような機能を持っているかは、環境ごとに異なる。
注意
使用例 ※この例は、Windows環境でのもの。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	if( system( NULL ) == 0 ){
		fputs( "コマンドプロセッサは存在しません。\n", stderr );
	}
	else{
		system( "copy /B test.txt test_copy.txt" );
	}
	
	return 0;
}

実行結果:

        1 個のファイルをコピーしました。
関連
解説章 第44章

参考リンク

Cクイックリファレンス 第2版
 -- C11対応のリファレンス。
S・P・ハービソン3世とG・L・スティール・ジュニアのCリファレンスマニュアル 第5版
 -- C99 まで網羅した最も詳細なリファレンス。
新ANSI C言語辞典
 -- 標準ライブラリについて詳しい。C99 には非対応。

更新履歴

'2017/7/30 clang 3.7 (Xcode 7.3) を、Xcode 8.3.3 に置き換え。

'2017/6/6 snprintf関数の説明を修正。

'2017/5/25 SIGABRT、SIG_DFL、SIG_ERR、SIG_IGN の説明を追加。

'2017/5/24 signal関数の説明を追加。

'2017/5/23 strftime関数の説明を追加。

'2017/5/3 setlocale関数、SCNdMAX、SCNiMAX、SCNoMAX、SCNuMAX、SCNxMAX の説明を追加。

'2017/4/18 size_t型、SIZE_MAXマクロ、strtof関数、strtold関数の説明を追加。

'2017/4/12 snprintf関数、swprintf関数の説明を追加。

'2017/3/13 scanf関数の説明に、%n変換に対する大きさ指定に関する記述を追加。

'2017/3/12 sqrtf関数、sqrtl関数の説明を追加。

'2017/3/10 sinf関数、sinl関数の説明を追加。

'2017/3/9 scanf関数、sscanf関数の戻り値の説明を修正。

'2017/3/5 strtoll関数、strtoull関数の説明を追加。

'2015/8/29 サンプルプログラム中で、flose関数の戻り値をチェックするようにした。

'2011/7/24 sscanf関数、swscanf関数の説明を追加。

'2011/6/5 scanf関数の説明を追加。strtol関数、strtoul関数の説明を修正。

'2011/6/4 strtok関数の説明を追加。

'2011/5/14 strrchr関数、strstr関数の説明を追加。

'2011/5/8 sprintf関数の説明を追加。

'2011/5/2 setbuf関数、setvbuf関数、sqrt関数の説明を追加。

'2011/5/1 srand関数の説明を追加。

'2011/2/27 strncat関数、strncmp関数、strncpy関数の説明を追加。

'2010/9/12 「FILE構造体」という表記を「ファイル構造体」に改めた。

'2010/8/27 strtod関数、strtol関数、strtoul関数の説明を追加。

'2010/7/25 strerror関数、system関数 の説明を追加。

'2010/6/6 SEEK_CUR、SEEK_END、SEEK_SET、stderr、stdin、stdout の説明を追加。

'2010/5/12 strcat関数、strchr関数、strcpy関数、strlen関数の説明を追加。

'2010/5/11 SCHAR_MAX、SCHAR_MIN、SHRT_MAX、SHRT_MIN の説明を追加。

'2010/5/8 sin関数の説明を追加。

'2009/8/20 strcmp関数の説明を追加。

'2009/2/27 新規作成。



標準ライブラリのリファレンスのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ