C言語/標準ライブラリ/文字列操作

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

概要[編集]

文字列操作の関数を使用するためには、 string.hというヘッダファイルを組み込む必要がある。 [1]

次に文字列操作の関数を表にまとめた。

形式 機能
コピー関数 コピーする
void *memcpy(void * restrict s1, const void * restrict s2, size_t n); 配列を扱う。コピー元とコピー先が重ならない。
void *memmove(void *s1, const void *s2, size_t n); 配列を扱う。コピー元とコピー先が重なる。
char *strcpy(char * restrict s1, const char * restrict s2); 文字列('\0'で終わる)を扱う。文字数を指定しない。
char *strncpy(char * restrict s1, const char * restrict s2, size_t n); 文字列('\0'で終わる)を扱う。文字数を指定する。
連結関数 文字列を連結する
char *strcat(char * restrict s1, const char * restrict s2); 文字数を指定しない。
char *strncat(char * restrict s1, const char * restrict s2, size_t n); 文字数を指定する。
比較関数 比較する
int memcmp(const void *s1, const void *s2, size_t n); 配列を扱う。
int strcmp(const char *s1, const char *s2); 文字列('\0'で終わる)を扱う。ロケールに従わない。文字数を指定しない。
int strncmp(const char *s1, const char *s2, size_t n); 文字列('\0'で終わる)を扱う。ロケールに従わない。文字数を指定する。
int strcoll(const char *s1, const char *s2); 文字列('\0'で終わる)を扱う。ロケールに従う。
size_t strxfrm(char * restrict s1, const char * restrict s2, size_t n); 文字列をロケールに従って変換する
探索関数 探索する
void *memchr(const void *s, int c, size_t n); 文字を探索する。配列を扱う。
char *strchr(const char *s, int c); 文字を探索する。文字列('\0'で終わる)を扱う。最初に現れる位置を捜す。
char *strrchr(const char *s, int c); 文字を探索する。文字列('\0'で終わる)を扱う。最後に現れる位置を捜す。
size_t strcspn(const char *s1, const char *s2); 文字群を探索する。含まない先頭部分の最大の長さを求める。
size_t strspn(const char *s1, const char *s2); 文字群を探索する。含む先頭部分の最大の長さを求める。
char *strpbrk(const char *s1, const char *s2); 文字群を探索する。最初に現れる位置を捜す。
char *strstr(const char *s1, const char *s2); 文字列を探索する。最初に現れる位置を捜す。
char *strtok(char * restrict s1, char * restrict s2); 文字列を文字群で字句に分割する。
その他の関数
void *memset(void *s, int c, size_t n); 配列に文字をセットする。
char *strerror(int errnum); エラー番号からメッセージ文字列を求める。
size_t strlen(const char *s); 文字列の長さを求める。

ロケール[編集]

ロケールとは、ソフトウェアに内蔵される、言語や国・地域ごとに異なる単位、記号、日付、通貨などの表記規則の集合である。 [2]

ロケールを設定するにはlocale.hのsetlocale関数を用いる。 詳細は文化圏固有操作<locale.h>を参照せよ。

[編集]

  • size_t

size_tは、sizeof演算子の結果の符号なし整数型とする。[3]

マクロ[編集]

  • NULL

NULLは、処理系定義の空ポインタ定数に展開する。[3]

コピー関数[編集]

[4]

memcpy関数[編集]

  • 形式
#include <string.h>
void *memcpy(void * restrict s1, const void * restrict s2, size_t n);
  • 引数
s1 コピー先のオブジェクト
s2 コピー元のオブジェクト
n コピーする文字数
  • 返却値
s1の値
  • 機能
s2が指すオブジェクトから、s1が指すオブジェクトに、n文字コピーする。
s1とs2が重なっている場合、その動作は未定義である。
返却値はs1の値を返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	int i;
	char s1[3]={'a', 'b', 'c'};
	char s2[3]={'d', 'e', 'f'};

	printf("\nコピー前のs1の値;");
	for(i=0; i<3; ++i)
		printf("%2x ", s1[i]);
	printf("\nコピー前のs2の値:");
	for(i=0; i<3; ++i)
		printf("%2x ", s2[i]);

	memcpy(s1, s2, 2);

	printf("\nコピー後のs1の値;");
	for(i=0; i<3; ++i)
		printf("%2x ", s1[i]);
	printf("\nコピー後のs2の値:");
	for(i=0; i<3; ++i)
		printf("%2x ", s2[i]);	
}

memmove関数[編集]

  • 形式
#include <string.h>
void *memmove(void *s1, const void *s2, size_t n);
  • 引数
s1 コピー先のオブジェクト
s2 コピー元のオブジェクト
n コピーする文字数
  • 返却値
s1の値
  • 機能
s2が指すオブジェクトから、s1が指すオブジェクトに、n文字コピーする。
s1とs2が重なっていてもよい。
返却値はs1の値を返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	int i;
	char s[6]={'a', 'b', 'c', 'd', 'e', 'f'};

	printf("\nコピー前のsの値;");
	for(i=0; i<6; ++i)
		printf("%2x ", s[i]);

	memmove(&s[3], &s[2], 2);

	printf("\nコピー後のsの値;");
	for(i=0; i<6; ++i)
		printf("%2x ", s[i]);
}

strcpy関数[編集]

  • 形式
#include <string.h>
char *strcpy(char * restrict s1, const char * restrict s2);
  • 引数
s1 コピー先の配列
s2 コピー元の文字列
  • 返却値
s1の値
  • 機能
s2が指す文字列(終端ナル文字を含む)をs1が指す配列にコピーする。
s1とs2が重なっている場合、その動作は未定義である。
返却値はs1の値を返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s1[16]="abc";
	char s2[16]="def";
	
	printf("コピー前のs1の値:%s\n", s1);
	printf("コピー前のs2の値:%s\n", s2);
	
	strcpy(s1, s2);
	
	printf("コピー後のs1の値:%s\n", s1);
	printf("コピー後のs2の値:%s\n", s2);
}

strncpy関数[編集]

  • 形式
#include <string.h>
char *strncpy(char * restrict s1, const char * restrict s2, size_t n);
  • 引数
s1 コピー先の配列
s2 コピー元の配列
n コピーする文字数
  • 返却値
s1の値
  • 機能
s2が指す配列から、s1が指す配列に、n個以下の文字(ナル文字に続く文字はコピーしない。)をコピーする。
s1とs2が重なっている場合、その動作は未定義である。
s2が指す配列がn文字より短い配列である場合、s1が指す配列中のコピーの後ろに、全体でn文字書き込むまでナル文字を付加する。
返却値はs1の値を返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s1[16]="abc";
	char s2[16]="def";
	
	printf("コピー前のs1の値:%s\n", s1);
	printf("コピー前のs2の値:%s\n", s2);
	
	strncpy(s1, s2, 2);
	
	printf("コピー後のs1の値:%s\n", s1);
	printf("コピー後のs2の値:%s\n", s2);
}

連結関数[編集]

[5]

strcat関数[編集]

  • 形式
#include <string.h>
char *strcat(char * restrict s1, const char * restrict s2);
  • 引数
s1 連結先の文字列
s2 連結する文字列
  • 返却値
s1の値
  • 機能
s2が指す文字列(終端ナル文字を含む。)のコピーをs1が指す文字列の最後に付加する。
s2の先頭の文字が、s1が指す文字列の最後のナル文字を書き換える。
s1とs2が重なっている場合、その動作は未定義である。
返却値はs1の値を返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s1[16]="abc";
	char s2[16]="def";
	
	printf("付加前のs1の値:%s\n", s1);
	printf("付加前のs2の値:%s\n", s2);
	
	strcat(s1, s2);
	
	printf("付加後のs1の値:%s\n", s1);
	printf("付加後のs2の値:%s\n", s2);
}

strncat関数[編集]

  • 形式
#include <string.h>
char *strncat(char * restrict s1, const char * restrict s2, size_t n);
  • 引数
s1 連結先の文字列
s2 連結する配列
n 連結する文字数
  • 返却値
s1の値
  • 機能
s2が指す配列からn個以下の文字を、s1が指す文字列の最後に付加する。
(ナル文字及びナル文字に続く文字は付加しない。)
s2の先頭の文字が、s1が指す文字列の最後のナル文字を書き換える。
終端ナル文字を常に結果に付加する。
s1とs2が重なっている場合、その動作は未定義である。
返却値はs1の値を返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s1[16]="abc";
	char s2[16]="def";
	
	printf("付加前のs1の値:%s\n", s1);
	printf("付加前のs2の値:%s\n", s2);
	
	strncat(s1, s2, 2);
	
	printf("付加後のs1の値:%s\n", s1);
	printf("付加後のs2の値:%s\n", s2);
}

比較関数[編集]

[6] 比較関数memcmp, strcmp及びstrncmpが返す0以外の値の符号は、 比較対象のオブジェクトにおいて最初に異なる文字の対 (いずれの文字の型もunsigned char として解釈する)、 の値の差の符号によって決定する。

memcmp関数[編集]

  • 形式
#include <string.h>
int memcmp(const void *s1, const void *s2, size_t n);
  • 引数
s1 比較するオブジェクト
s2 比較するオブジェクト
n 比較する文字数
  • 返却値
比較の結果
  • 機能
s1が指すオブジェクトの始めのn文字と、s2が指すオブジェクトの始めのn文字を比較する。
返却値はs1がs2より大きいか、等しいか、又は小さいかによって、それぞれ、0より大きい、0に等しい、又は0より小さい整数を返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	int ret;
	char s1[]={'a', 'b', 'c'};
	char s2[]={'a', 'd', 'e'};
	
	ret=memcmp(s1, s2, 1);
	if(ret==0)
		printf("s1とs2の初めの1文字を比較すると、s1はs2と等しい。\n");
	else if(ret>0)
		printf("s1とs2の初めの1文字を比較すると、s1はs2より大きい。\n");
	else if(ret<0)
		printf("s1とs2の初めの1文字を比較すると、s1はs2より小さい。\n");

	ret=memcmp(s1, s2, 2);
	if(ret==0)
		printf("s1とs2の初めの2文字を比較すると、s1はs2と等しい。\n");
	else if(ret>0)
		printf("s1とs2の初めの2文字を比較すると、s1はs2より大きい。\n");
	else if(ret<0)
		printf("s1とs2の初めの2文字を比較すると、s1はs2より小さい。\n");
}

strcmp関数[編集]

  • 形式
#include <string.h>
int strcmp(const char *s1, const char *s2);
  • 引数
s1 比較する文字列
s2 比較する文字列
  • 返却値
比較の結果
  • 機能
s1が指す文字列とs2が指す文字列を比較する。
返却値はs1が指す文字列が、s2が指す文字列より大きいか、等しいか、又は小さいかによって、それぞれ、0より大きい、0に等しい、又は0より小さい整数を返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	int ret;
	char s1[]="abc";
	char s2[]="ade";
	
	ret=strcmp(s1, s2);
	if(ret==0)
		printf("s1とs2を比較すると、s1はs2と等しい。\n");
	else if(ret>0)
		printf("s1とs2を比較すると、s1はs2より大きい。\n");
	else if(ret<0)
		printf("s1とs2を比較すると、s1はs2より小さい。\n");
}

strcoll関数[編集]

  • 形式
#include <string.h>
int strcoll(const char *s1, const char *s2);
  • 引数
s1 比較する文字列
s2 比較する文字列
  • 返却値
比較の結果
  • 機能
s1が指す文字列とs2が指す文字列を比較する。
このとき、いずれの文字列も、その時点のロケールのLC_COLLATEカテゴリに従って解釈する。
返却値は、s1が指す文字列及びs2が指す文字列をその時点のロケールに従って解釈したとき、
s1が指す文字列が、s2が指す文字列より大きいか、等しいか、又は小さいかによって、それぞれ、0より大きい、0に等しい、又は0より小さい整数を返す。
#include <stdio.h>
#include <locale.h>
#include <string.h>

int main(void)
{
	int ret;
	char s1[]="abc";
	char s2[]="ABC";

	setlocale(LC_COLLATE, "C");
	ret=strcoll(s1, s2);
	if(ret==0)
		printf("s1とs2を\"C\"ロケールで比較すると、s1はs2と等しい。\n");
	else if(ret>0)
		printf("s1とs2を\"C\"ロケールで比較すると、s1はs2より大きい。\n");
	else if(ret<0)
		printf("s1とs2を\"C\"ロケールで比較すると、s1はs2より小さい。\n");

	setlocale(LC_COLLATE, "JPN");
	ret=strcoll(s1, s2);
	if(ret==0)
		printf("s1とs2を\"JPN\"ロケールで比較すると、s1はs2と等しい。\n");
	else if(ret>0)
		printf("s1とs2を\"JPN\"ロケールで比較すると、s1はs2より大きい。\n");
	else if(ret<0)
		printf("s1とs2を\"JPN\"ロケールで比較すると、s1はs2より小さい。\n");
}

strncmp関数[編集]

  • 形式
#include <string.h>
int strncmp(const char *s1, const char *s2, size_t n);
  • 引数
s1 比較する配列
s2 比較する配列
n 比較する文字数
  • 返却値
比較の結果
  • 機能
s1が指す配列をs2が指す配列と比較する。
比較する文字はn文字以下とする。(ナル文字に続く文字は比較しない)
返却値は、s1が指す配列(ナル文字で終了しうる)が、s2が指す配列(ナル文字で終了しうる)より大きいか、等しいか、又は小さいかによって、それぞれ、0より大きい、0に等しい、又は0より小さい整数を返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	int ret;
	char s1[]="abc";
	char s2[]="ade";

	ret=strncmp(s1, s2, 1);
	if(ret==0)
		printf("s1とs2の初めの1文字を比較すると、s1はs2と等しい。\n");
	else if(ret>0)
		printf("s1とs2の初めの1文字を比較すると、s1はs2より大きい。\n");
	else if(ret<0)
		printf("s1とs2の初めの1文字を比較すると、s1はs2より小さい。\n");

	ret=strncmp(s1, s2, 4);
	if(ret==0)
		printf("s1とs2の初めの4文字を比較すると、s1はs2と等しい。\n");
	else if(ret>0)
		printf("s1とs2の初めの4文字を比較すると、s1はs2より大きい。\n");
	else if(ret<0)
		printf("s1とs2の初めの4文字を比較すると、s1はs2より小さい。\n");
}

strxfrm関数[編集]

  • 形式
#include <string.h>
size_t strxfrm(char * restrict s1, const char * restrict s2, size_t n);
  • 引数
s1 変換の結果の格納先の配列
s2 変換する文字列
n 格納する変換した結果の文字数
  • 返却値
変換した結果の文字列の長さ
  • 機能
s2が指す文字列を変換し、その結果の文字列をs1が指す配列に格納する。
その変換は次の通りとする。
すなわち、strcmp関数を変換結果の2つの文字列に適用した場合、strcmp関数が0より大きい値を返すか、0を返すか、又は0より小さい値を返すかは、2つの変換前の文字列をstrcoll関数に適用した結果と一致する。
終端ナル文字を含めて、n個を超える文字を、s1が指す結果の配列に格納することはない。
nが0である場合、s1は空ポインタであってもよい。
s1とs2が重なっている場合、その動作は未定義である。
返却値は、変換した結果の文字列(終端ナル文字は含まない)の長さを返す。
返却された値がn以上の場合、s1が指す配列の内容は不定とする。
#include <stdio.h>
#include <locale.h>
#include <string.h>

int main(void)
{
	char *p;
	char s1[16];
	char s2[]="abc";

	setlocale(LC_COLLATE, "JPN");
	strxfrm(s1, s2, 16);

	printf("\ns1の値;");
	for(p=s1; *p!='\0'; ++p)
		printf("%2x ", *p);
}

探索関数[編集]

[7]

memchr関数[編集]

  • 形式
#include <string.h>
void *memchr(const void *s, int c, size_t n);
  • 引数
s 探索の対象のオブジェクト
c 探索する文字
n 探索する文字数
  • 返却値
捜し出した文字へのポインタ
  • 機能
sが指すオブジェクトの先頭のn文字(各々unsigned char型として解釈する。)の中でc(unsigned char型に型変換する。)が最初に現れる位置を捜す。
返却値は、捜し出した文字へのポインタを返す。
オブジェクトの中にその文字が現れない場合、空ポインタを返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s[6]={'a', 'b', 'c', 'd', 'e', 'f'};
	char *p;
	
	p=memchr(s, 'd', 3);
	if(p)
		printf("sの初めの3文字の中で'd'が最初に現れる位置は[%d]。\n", p-s);
	else
		printf("sの初めの3文字の中で'd'は現れない。\n");

	p=memchr(s, 'd', 6);
	if(p)
		printf("sの初めの6文字の中で'd'が最初に現れる位置は[%d]。\n", p-s);
	else
		printf("sの初めの6文字の中で'd'は現れない。\n");
}

strchr関数[編集]

  • 形式
#include <string.h>
char *strchr(const char *s, int c);
  • 引数
s 探索の対象の文字列
c 探索する文字
  • 返却値
捜し出した文字へのポインタ
  • 機能
sが指す文字列の中で、c(char型に型変換する。)が最初に現れる位置を捜す。
終端ナル文字は文字列の一部とみなす。
返却値は、捜し出した文字へのポインタを返す。
文字列の中にその文字が現れない場合、空ポインタを返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s[]="abcdef";
	char *p;
	
	p=strchr(s, 'd');
	if(p)
		printf("sの中で'd'が最初に現れる位置は[%d]。\n", p-s);
	else
		printf("sの中で'd'は現れない。\n");
}

strcspn関数[編集]

  • 形式
#include <string.h>
size_t strcspn(const char *s1, const char *s2);
  • 引数
s1 探索の対象の文字列
s2 探索する文字群
  • 返却値
先頭部分の長さ
  • 機能
s1が指す文字列の中で、s2が指す文字列中の文字を含まない先頭部分の最大の長さを計算する。
返却値は、その先頭部分の長さを返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s1[]="abcdef";
	char s2[]="abc";
	char s3[]="def";
	int len;
	
	len=strcspn(s1, s2);
	printf("%sの中で%sの文字群が含まれない先頭部分の最大の長さは%dです。\n", s1, s2, len);

	len=strcspn(s1, s3);
	printf("%sの中で%sの文字群が含まれない先頭部分の最大の長さは%dです。\n", s1, s3, len);
}

strpbrk関数[編集]

  • 形式
#include <string.h>
char *strpbrk(const char *s1, const char *s2);
  • 引数
s1 探索の対象の文字列
s2 探索する文字群
  • 返却値
文字へのポインタ
  • 機能
s1が指す文字列の中で、s2が指す文字列の中のいずれかの文字が最初に現れる位置を捜す。
返却値は、その文字へのポインタを返す。
s1が指す文字列の中に、s2が指す文字列の中のいずれの文字も現れない場合、空ポインタを返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s1[]="abcdef";
	char s2[]="abc";
	char s3[]="def";
	char *p;
	
	p=strpbrk(s1, s2);
	if(p)
		printf("%sの中で%sの文字群が最初に現れる位置は[%d]です。\n", s1, s2, p-s1);
	else
		printf("%sの中で%sの文字群は現れない。\n", s1, s2);

	p=strpbrk(s1, s3);
	if(p)
		printf("%sの中で%sの文字群が最初に現れる位置は[%d]です。\n", s1, s3, p-s1);
	else
		printf("%sの中で%sの文字群は現れない。\n", s1, s3);
}

strrchr関数[編集]

  • 形式
#include <string.h>
char *strrchr(const char *s, int c);
  • 引数
s 探索の対象の文字列
c 探索する文字
  • 返却値
文字へのポインタ
  • 機能
sが指す文字列の中で、c(char型に型変換する。)が最後に現れる位置を捜す。
終端ナル文字は文字列の一部とみなす。
返却値はその文字へのポインタを返す。
文字列の中にcが現れない場合、空ポインタを返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s[]="abcdefabcdef";
	char *p;
	
	p=strrchr(s, 'd');
	if(p)
		printf("%sの中で'd'が最後に現れる位置は[%d]です。\n", s, p-s);
	else
		printf("%sの中で'd'は現れない。\n", s);
}

strspn関数[編集]

  • 形式
#include <string.h>
size_t strspn(const char *s1, const char *s2);
  • 引数
s1 探索の対象の文字列
s2 探索する文字群
  • 返却値
先頭部分の長さ
  • 機能
s1が指す文字列の中で、s2が指す文字列中の文字だけを含む先頭部分の最大の長さを計算する。
返却値は、その先頭部分の長さを返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s1[]="abcdef";
	char s2[]="abc";
	char s3[]="def";
	int len;
	
	len=strspn(s1, s2);
	printf("%sの中で%sの文字群が含まれる先頭部分の最大の長さは%dです。\n", s1, s2, len);

	len=strspn(s1, s3);
	printf("%sの中で%sの文字群が含まれる先頭部分の最大の長さは%dです。\n", s1, s3, len);
}

strstr関数[編集]

  • 形式
#include <string.h>
char *strstr(const char *s1, const char *s2);
  • 引数
s1 探索の対象の文字列
s2 探索する文字列
  • 返却値
探し出した文字列へのポインタ
  • 機能
s1が指す文字列の中で、s2が指す文字列の中の文字の並び(終端ナル文字を除く。)が最初に現れる位置を捜す。
返却値は、探し出した文字列へのポインタを返す。
その文字列が見つからなかった場合、空ポインタを返す。
s2が長さ0の文字列を指す場合、s1を返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s1[]="abcdef";
	char s2[]="abc";
	char s3[]="def";
	char *p;
	
	p=strstr(s1, s2);
	printf("%sの中で%sの文字列が最初に現れる位置は[%d]です。\n", s1, s2, p-s1);

	p=strstr(s1, s3);
	printf("%sの中で%sの文字列が最初に現れる位置は[%d]です。\n", s1, s3, p-s1);
}

strtok関数[編集]

  • 形式
#include <string.h>
char *strtok(char * restrict s1, char * restrict s2);
  • 引数
s1 分割の対象の文字列
s2 字句を区切る文字群
  • 返却値
字句の最初の文字へのポインタ
  • 機能
strtok関数の一連の呼び出しは、s1が指す文字列を、s2が指す文字列の中のいずれかの文字で区切られる字句の列に分割する。
一連の呼び出しの最初の呼び出しでは、第1実引数として空ポインタ以外を指定する。
それ以降の呼び出しでは、第1実引数として空ポインタを指定する。
s2が指す区切り文字は、呼出しごとに異なっていてもよい。

一連の呼び出しの中の最初の呼び出しでは、s2が指すその時点での区切り文字列に含まれない最初の文字を、s1が指す文字列中で捜す。
その文字が見つからない場合、s1が指す文字列には字句が存在せず、strtok関数は空ポインタを返す。
その文字が見つかった場合、それを最初に字句の始まりとする。

次に、strtok関数は、見つかった文字の位置からその時点での区切り文字列に含まれている文字を捜す。その文字が見つからない場合、その時点の字句をs1が指す文字列の最後までとみなし、次回以降の探索では空ポインタを返す。
その文字が見つかった場合、その文字をナル文字で書き換え、その時点の字句を終了させる。
strtok関数はその次の文字へのポインタを保持しておき、字句の次の探索はそこから開始する。

第1実引数の値が空ポインタを持つ2回目以降の各呼び出しでは、保持したポインタが指すところから探索を開始する以外は、これと同じ動作をする。

処理系は、いかなるライブラリ関数もstrtok関数を呼び出さない場合の動作と同じ動作をしなければならない。

返却値は、字句の最初の文字へのポインタを返す。
字句が存在しない場合、空ポインタを返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	char str[]="abc def,ghi.";
	char *p;

	p=strtok(str, " ,.");
	printf("%s\n", p);
	while(p!=NULL){
		p=strtok(NULL, " ,.");
		printf("%s\n", p);
	}
}

その他の関数[編集]

[8]

memset関数[編集]

  • 形式
#include <string.h>
void *memset(void *s, int c, size_t n);
  • 引数
s セット先のオブジェクト
c セットする文字
n セットする文字数
  • 返却値
  • 機能
c(unsigned char型に型変換する。)の値を、sが指すオブジェクトの最初のn文字のそれぞれにコピーする。
返却値は、sの値を返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	int i;
	char s[6];
	memset(s, 'a', 6);

	printf("\nsの値;");
	for(i=0; i<6; ++i)
		printf("%2x ", s[i]);
}

strerror関数[編集]

  • 形式
#include <string.h>
char *strerror(int errnum);
  • 引数
errnum エラー番号
  • 返却値
文字列へのポインタ
  • 機能
errnumに入っている番号をメッセージ文字列に対応付ける。
典型的にはerrnumの値は、errnoが使われるが、strerror関数はint型の全ての値に対してメッセージを割り当てなければならない。

処理系は、いかなるライブラリ関数もstrerror関数を呼び出さない場合の動作と同じ動作をしなければならない。

返却値は、文字列へのポインタを返す。
その内容は、文化圏固有とする。
このポインタが指す配列をプログラムで変更してはならないが、strerror関数のそれ以降の呼び出しで書き変わることがある。
#include <stdio.h>
#include <string.h>

int main(void)
{
	int errnum;
	
	for(errnum=0; errnum<50; ++errnum)
		printf("%2d:%s\n", errnum, strerror(errnum));
}

strlen関数[編集]

  • 形式
#include <string.h>
size_t strlen(const char *s);
  • 引数
s 長さを計算する文字列
  • 返却値
文字列の長さ
  • 機能
sが指す文字列の長さを計算する。
返却値は、終端ナル文字に先行する文字の個数を返す。
#include <stdio.h>
#include <string.h>

int main(void)
{
	char s[]="abcdef";
	int len;
	len=strlen(s);
	printf("%sの長さは%dです。\n", s, len);
}

脚注[編集]

  1. ^ 『JISX3010:2003』p.233「7.21 文字列操作<string.h>」
  2. ^ ロケールとは - 意味/解説/説明/定義 : IT用語辞典
  3. ^ 3.0 3.1 『JISX3010:2003』p.183「7.17 共通の定義<stddef.h>」
  4. ^ 『JISX3010:2003』p.233「7.21.2 コピー関数」
  5. ^ 『JISX3010:2003』p.235「7.21.3 連結関数」
  6. ^ 『JISX3010:2003』p.236「7.21.4 比較関数」
  7. ^ 『JISX3010:2003』p.236「7.21.5 探索関数」
  8. ^ 『JISX3010:2003』p.239「7.21.6 その他の関数」

参考文献[編集]

  • 日本工業標準調査会『JISX3010 プログラム言語C』2003年12月20日改正