「C言語/標準ライブラリ/string.h」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎memcmp関数: イテレーションに変更
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
リファクタリング。多用していたbr要素をdd要素で置換え。
タグ: 2017年版ソースエディター
 
106 行
:s1の値
; 機能
:s2が指すオブジェクトから、s1が指すオブジェクトに、n文字コピーする。<br>
:s1とs2が重なっている場合、その動作は'''未定義'''である。
: 返却値はs1の値を返す。
; 例
113 ⟶ 114行目:
#include <string.h>
 
int main(void) {
char s1[3] = {'a', 'b', 'c'};
{
char s1s2[3] = {'ad', 'be', 'cf'};
char s2[3] = {'d', 'e', 'f'};
 
printf("\nコピー前のs1の値;");
for (int i = 0; i < 3; i++)
printf("%2x ", s1[i]);
printf("\nコピー前のs2の値:");
for (int i = 0; i < 3; i++)
printf("%2x ", s2[i]);
 
memcpy(s1, s2, 2);
 
printf("\nコピー後のs1の値;");
for (int i = 0; i < 3; i++)
printf("%2x ", s1[i]);
printf("\nコピー後のs2の値:");
for (int i = 0; i < 3; i++)
printf("%2x ", s2[i]);
}
</syntaxhighlight>
149 行
:s1の値
; 機能
:s2が指すオブジェクトから、s1が指すオブジェクトに、n文字コピーする。<br>
:s1とs2が重なっていてもよい。<br>
:返却値はs1の値を返す。
; 例
: <syntaxhighlight lang=c>
155 ⟶ 157行目:
#include <string.h>
 
int main(void) {
char s[6] = {'a', 'b', 'c', 'd', 'e', 'f'};
{
int i;
char s[6] = {'a', 'b', 'c', 'd', 'e', 'f'};
 
printf("\nコピー前のsの値;");
for (int i = 0; i < 6; i++)
printf("%2x ", s[i]);
 
memmove(&s[3], &s[2], 2);
 
printf("\nコピー後のsの値;");
for (int i = 0; i < 6; i++)
printf("%2x ", s[i]);
}
</syntaxhighlight>
192 行
#include <string.h>
 
int main(void) {
char s1[16] = "abc";
{
char s1s2[16] = "abcdef";
 
char s2[16] = "def";
printf("コピー前のs1の値:%s\n", s1);
printf("コピー前のs1s2の値:%s\n", s1s2);
 
printf("コピー前のs2の値:%s\n", s2);
strcpy(s1, s2);
 
strcpy(s1, s2);
printf("コピー後のs1の値:%s\n", s1);
printf("コピー後のs1s2の値:%s\n", s1s2);
printf("コピー後のs2の値:%s\n", s2);
}
</syntaxhighlight>
229 ⟶ 228行目:
#include <string.h>
 
int main(void) {
char s1[16] = "abc";
{
char s1s2[16] = "abcdef";
 
char s2[16] = "def";
printf("コピー前のs1の値:%s\n", s1);
printf("コピー前のs1s2の値:%s\n", s1s2);
 
printf("コピー前のs2の値:%s\n", s2);
strcpy(s1, s2);
 
strncpy(s1, s2, 2);
printf("コピー後のs1の値:%s\n", s1);
printf("コピー後のs1s2の値:%s\n", s1s2);
printf("コピー後のs2の値:%s\n", s2);
}
</syntaxhighlight>
 
== 連結関数 ==
<ref>『JISX3010:2003』p.235「7.21.3 連結関数」</ref>
257 ⟶ 256行目:
:s1の値
; 機能
:s2が指す文字列(終端ナル文字を含む。)のコピーをs1が指す文字列の最後に付加する。<br>
:s2の先頭の文字が、s1が指す文字列の最後のナル文字を書き換える。<br>
:s1とs2が重なっている場合、その動作は'''未定義'''である。
: 返却値はs1の値を返す。
; 例
264 ⟶ 265行目:
#include <string.h>
 
int main(void) {
char s1[16] = "abc";
{
char s1s2[16] = "abcdef";
 
char s2[16] = "def";
printf("付加前のs1の値:%s\n", s1);
printf("付加前のs1s2の値:%s\n", s1s2);
 
printf("付加前のs2の値:%s\n", s2);
strcat(s1, s2);
 
strcat(s1, s2);
printf("付加後のs1の値:%s\n", s1);
printf("付加後のs1s2の値:%s\n", s1s2);
printf("付加後のs2の値:%s\n", s2);
}
</syntaxhighlight>
 
=== strncat関数 ===
; 形式
291 ⟶ 292行目:
:s1の値
; 機能
:s2が指す配列からn個以下の文字を、s1が指す文字列の最後に付加する。<br>
:(ナル文字及びナル文字に続く文字は付加しない。)<br>
: s2の先頭の文字が、s1が指す文字列の最後のナル文字を書き換える。<br>
:終端ナル文字を常に結果に付加する。<br>
:s1とs2が重なっている場合、その動作は'''未定義'''である。
: 返却値はs1の値を返す。
; 例
298 ⟶ 303行目:
#include <string.h>
 
int main(void) {
char s1[16] = "abc";
{
char s1s2[16] = "abcdef";
 
char s2[16] = "def";
printf("付加前のs1の値:%s\n", s1);
printf("付加前のs1s2の値:%s\n", s1s2);
 
printf("付加前のs2の値:%s\n", s2);
strncat(s1, s2, 2);
 
strncat(s1, s2, 2);
printf("付加後のs1の値:%s\n", s1);
printf("付加後のs1s2の値:%s\n", s1s2);
printf("付加後のs2の値:%s\n", s2);
}
</syntaxhighlight>
 
== 比較関数 ==
<ref>『JISX3010:2003』p.236「7.21.4 比較関数」</ref>
386 ⟶ 391行目:
#include <string.h>
 
int main(void) {
char s1[] = "abc";
{
char s2[] = "ade";
int ret;
 
char s1[] = "abc";
int result = strcmp(s1, s2);
char s2[] = "ade";
if (result == 0)
printf("s1とs2を比較すると、s1はs2と等しい。\n");
ret=strcmp(s1, s2);
else if (ret==result > 0)
printf("s1とs2を比較すると、s1はs2と等しより大きい。\n");
else if (ret>result < 0)
printf("s1とs2を比較すると、s1はs2より大き小さい。\n");
else if (ret<0)
printf("s1とs2を比較すると、s1はs2より小さい。\n");
}
</syntaxhighlight>
 
=== strcoll関数 ===
; 形式
413 ⟶ 417行目:
:比較の結果
; 機能
:s1が指す文字列とs2が指す文字列を比較する。<br>
:このとき、いずれの文字列も、その時点のロケールのLC_COLLATEカテゴリに従って解釈する。<br>
:返却値は、s1が指す文字列及びs2が指す文字列をその時点のロケールに従って解釈したとき、<br>s1が指す文字列が、s2が指す文字列より大きいか、等しいか、又は小さいかによって、それぞれ、0より大きい、0に等しい、又は0より小さい整数を返す。
; 例
: <syntaxhighlight lang=c>
#include <stdio.h>
#include <locale.h>
#include <stdio.h>
#include <string.h>
 
int main(void) {
char s1[] = "abc";
{
char s2[] = "ABC";
int ret;
char s1[] = "abc";
char s2[] = "ABC";
 
setlocale(LC_COLLATE, "C");
ret int result = strcoll(s1, s2);
if (retresult == 0)
printf("s1とs2を\"C\"ロケールで比較すると、s1はs2と等しい。\n");
else if (retresult > 0)
printf("s1とs2を\"C\"ロケールで比較すると、s1はs2より大きい。\n");
else if (retresult < 0)
printf("s1とs2を\"C\"ロケールで比較すると、s1はs2より小さい。\n");
 
setlocale(LC_COLLATE, "JPN");
ret result = strcoll(s1, s2);
if (retresult == 0)
printf("s1とs2を\"JPN\"ロケールで比較すると、s1はs2と等しい。\n");
else if (retresult > 0)
printf("s1とs2を\"JPN\"ロケールで比較すると、s1はs2より大きい。\n");
else if (retresult < 0)
printf("s1とs2を\"JPN\"ロケールで比較すると、s1はs2より小さい。\n");
}
</syntaxhighlight>
 
=== strncmp関数 ===
; 形式
458 ⟶ 463行目:
:比較の結果
; 機能
:s1が指す配列をs2が指す配列と比較する。<br>
:比較する文字はn文字以下とする。(ナル文字に続く文字は比較しない)<br>返却値は、s1が指す配列(ナル文字で終了しうる)が、s2が指す配列(ナル文字で終了しうる)より大きいか、等しいか、又は小さいかによって、それぞれ、0より大きい、0に等しい、又は0より小さい整数を返す。
; 例
: <syntaxhighlight lang=c>
464 ⟶ 470行目:
#include <string.h>
 
int main(void) {
char s1[] = "abc";
{
char s2[] = "ade";
int ret;
char s1[] = "abc";
char s2[] = "ade";
 
ret int result = strncmp(s1, s2, 1);
if (retresult == 0)
printf("s1とs2の初めの1文字を比較すると、s1はs2と等しい。\n");
else if (retresult > 0)
printf("s1とs2の初めの1文字を比較すると、s1はs2より大きい。\n");
else if (retresult < 0)
printf("s1とs2の初めの1文字を比較すると、s1はs2より小さい。\n");
 
ret result = strncmp(s1, s2, 4);
if (retresult == 0)
printf("s1とs2の初めの4文字を比較すると、s1はs2と等しい。\n");
else if (retresult > 0)
printf("s1とs2の初めの4文字を比較すると、s1はs2より大きい。\n");
else if (retresult < 0)
printf("s1とs2の初めの4文字を比較すると、s1はs2より小さい。\n");
}
</syntaxhighlight>
 
=== strxfrm関数 ===
; 形式
510 ⟶ 515行目:
; 例
: <syntaxhighlight lang=c>
#include <stdio.h>
#include <locale.h>
#include <stdio.h>
#include <string.h>
 
int main(void) {
char s1[16];
{
char *ps2[] = "abc";
char s1[16];
char s2[] = "abc";
 
setlocale(LC_COLLATE, "JPN");
strxfrm(s1, s2, 16);
 
printf("\ns1の値;");
for (char *p = s1; *p != '\0'; p++)
printf("%2x ", *p);
}
</syntaxhighlight>
544 ⟶ 547行目:
:捜し出した文字へのポインタ
; 機能
:sが指すオブジェクトの先頭のn文字(各々unsigned char型として解釈する。)の中でc(unsigned char型に型変換する。)が最初に現れる位置を捜す。<br>
:返却値は、捜し出した文字へのポインタを返す。<br>
:オブジェクトの中にその文字が現れない場合、空ポインタを返す。
; 例
: <syntaxhighlight lang=c>
550 ⟶ 555行目:
#include <string.h>
 
int main(void) {
char s[6] = {'a', 'b', 'c', 'd', 'e', 'f'};
{
char s[6]*p = {'a', 'b', 'c'memchr(s, 'd', 'e', 'f'}3);
char *p = memchr(s, 'd', 3);
 
if (p != NULL)
printf("sの初めの3文字の中で'd'が最初に現れる位置は[%d]。\n", p - s);
else
printf("sの初めの3文字の中で'd'は現れない。\n");
 
p = memchr(s, 'd', 6);
if (p != NULL)
printf("sの初めの6文字の中で'd'が最初に現れる位置は[%d]。\n", p - s);
else
printf("sの初めの6文字の中で'd'は現れない。\n");
}
</syntaxhighlight>
 
=== strchr関数 ===
; 形式
579 ⟶ 584行目:
:捜し出した文字へのポインタ
; 機能
:sが指す文字列の中で、c(char型に型変換する。)が最初に現れる位置を捜す。<br>
:終端ナル文字は文字列の一部とみなす。<br>
:返却値は、捜し出した文字へのポインタを返す。<br>
:文字列の中にその文字が現れない場合、空ポインタを返す。
; 例
: <syntaxhighlight lang=c>
585 ⟶ 593行目:
#include <string.h>
 
int main(void) {
char s[] = "abcdef";
{
char s[]*p = "abcdef"strchr(s, 'd');
if (p != NULL)
char *p = strchr(s, 'd');
printf("sの中で'd'が最初に現れる位置は[%d]。\n", p - s);
if (p)
else
printf("sの中で'd'が最初に現れる位置は[%d]。\n", p-s);
printf("sの中で'd'は現れない。\n");
else
printf("sの中で'd'は現れない。\n");
}
</syntaxhighlight>
 
=== strcspn関数 ===
; 形式
607 ⟶ 615行目:
:先頭部分の長さ
; 機能
:s1が指す文字列の中で、s2が指す文字列中の文字を含まない先頭部分の最大の長さを計算する。<br>
:返却値は、その先頭部分の長さを返す。
; 例
: <syntaxhighlight lang=c>
613 ⟶ 622行目:
#include <string.h>
 
int main(void) {
char s1[] = "abcdef";
{
char s1s2[] = "abcdefabc";
char s2s3[] = "abcdef";
int len = strcspn(s1, s2);
char s3[] = "def";
printf("%sの中で%sの文字群が含まれない先頭部分の最大の長さは%dです。\n", s1,
int len;
s2, 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);
}
</syntaxhighlight>
639 ⟶ 647行目:
:文字へのポインタ
; 機能
:s1が指す文字列の中で、s2が指す文字列の中のいずれかの文字が最初に現れる位置を捜す。<br>
:返却値は、その文字へのポインタを返す。<br>
:s1が指す文字列の中に、s2が指す文字列の中のいずれの文字も現れない場合、空ポインタを返す。
; 例
: <syntaxhighlight lang=c>
645 ⟶ 655行目:
#include <string.h>
 
int main(void) {
char s1[] = "abcdef";
{
char s1s2[] = "abcdefabc";
char s2s3[] = "abcdef";
char s3[]*p = "def"strpbrk(s1, s2);
char *p = strpbrk(s1, s2);
 
if (p != NULL)
printf("%sの中で%sの文字群が最初に現れる位置は[%d]です。\n", s1, s2, p-s1);
p - s1);
else
else
printf("%sの中で%sの文字群は現れない。\n", s1, s2);
printf("%sの中で%sの文字群は現れない。\n", s1, s2);
 
p = strpbrk(s1, s3);
if (p != NULL)
printf("%sの中で%sの文字群が最初に現れる位置は[%d]です。\n", s1, s3, p-s1);
p - s1);
else
else
printf("%sの中で%sの文字群は現れない。\n", s1, s3);
printf("%sの中で%sの文字群は現れない。\n", s1, s3);
}
</syntaxhighlight>
 
=== strrchr関数 ===
; 形式
676 ⟶ 688行目:
:文字へのポインタ
; 機能
:sが指す文字列の中で、c(char型に型変換する。)が最後に現れる位置を捜す。<br>
:終端ナル文字は文字列の一部とみなす。<br>
:返却値はその文字へのポインタを返す。<br>
:文字列の中にcが現れない場合、空ポインタを返す。
; 例
: <syntaxhighlight lang=c>
682 ⟶ 697行目:
#include <string.h>
 
int main(void) {
char s[] = "abcdefabcdef";
{
char s[]*p = "abcdefabcdef"strrchr(s, 'd');
char *p = strrchr(s, 'd');
 
if (p != NULL)
printf("%sの中で'd'が最後に現れる位置は[%d]です。\n", s, p - s);
else
printf("%sの中で'd'は現れない。\n", s);
}
</syntaxhighlight>
 
=== strspn関数 ===
; 形式
705 ⟶ 720行目:
:先頭部分の長さ
; 機能
:s1が指す文字列の中で、s2が指す文字列中の文字だけを含む先頭部分の最大の長さを計算する。<br>
:返却値は、その先頭部分の長さを返す。
; 例
: <syntaxhighlight lang=c>
711 ⟶ 727行目:
#include <string.h>
 
int main(void) {
char s1[] = "abcdef";
{
char s1s2[] = "abcdefabc";
char s2s3[] = "abcdef";
int len = strspn(s1, s2);
char s3[] = "def";
printf("%sの中で%sの文字群が含まれる先頭部分の最大の長さは%dです。\n", s1, s2,
int len;
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);
len);
}
</syntaxhighlight>
 
=== strstr関数 ===
; 形式
737 ⟶ 753行目:
:探し出した文字列へのポインタ
; 機能
:s1が指す文字列の中で、s2が指す文字列の中の文字の並び(終端ナル文字を除く。)が最初に現れる位置を捜す。<br>
:返却値は、探し出した文字列へのポインタを返す。<br>
:その文字列が見つからなかった場合、空ポインタを返す。<br>
:s2が長さ0の文字列を指す場合、s1を返す。
; 例
: <syntaxhighlight lang=c>
743 ⟶ 762行目:
#include <string.h>
 
int main(void) {
char s1[] = "abcdef";
{
char s1s2[] = "abcdefabc";
char s2s3[] = "abcdef";
char s3[]*p = "def"strstr(s1, s2);
printf("%sの中で%sの文字列が最初に現れる位置は[%d]です。\n", s1, s2, p - s1);
char *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);
}
</syntaxhighlight>
768 ⟶ 786行目:
:字句の最初の文字へのポインタ
; 機能
:strtok関数の一連の呼び出しは、s1が指す文字列を、s2が指す文字列の中のいずれかの文字で区切られる字句の列に分割する。
:strtok関数の一連の呼び出しは、s1が指す文字列を、s2が指す文字列の中のいずれかの文字で区切られる字句の列に分割する。<br>一連の呼び出しの最初の呼び出しでは、第1実引数として空ポインタ以外を指定する。<br>それ以降の呼び出しでは、第1実引数として空ポインタを指定する。<br>s2が指す区切り文字は、呼出しごとに異なっていてもよい。<br><br>一連の呼び出しの中の最初の呼び出しでは、s2が指すその時点での区切り文字列に含まれない最初の文字を、s1が指す文字列中で捜す。<br>その文字が見つからない場合、s1が指す文字列には字句が存在せず、strtok関数は空ポインタを返す。<br>その文字が見つかった場合、それを最初に字句の始まりとする。<br><br>次に、strtok関数は、見つかった文字の位置からその時点での区切り文字列に含まれている文字を捜す。その文字が見つからない場合、その時点の字句をs1が指す文字列の最後までとみなし、次回以降の探索では空ポインタを返す。<br>その文字が見つかった場合、その文字をナル文字で書き換え、その時点の字句を終了させる。<br>strtok関数はその次の文字へのポインタを保持しておき、字句の次の探索はそこから開始する。<br><br>第1実引数の値が空ポインタを持つ2回目以降の各呼び出しでは、保持したポインタが指すところから探索を開始する以外は、これと同じ動作をする。<br><br>処理系は、いかなるライブラリ関数もstrtok関数を呼び出さない場合の動作と同じ動作をしなければならない。<br><br>返却値は、字句の最初の文字へのポインタを返す。<br>字句が存在しない場合、空ポインタを返す。
:一連の呼び出しの最初の呼び出しでは、第1実引数として空ポインタ以外を指定する。
:それ以降の呼び出しでは、第1実引数として空ポインタを指定する。
:s2が指す区切り文字は、呼出しごとに異なっていてもよい。
:一連の呼び出しの中の最初の呼び出しでは、s2が指すその時点での区切り文字列に含まれない最初の文字を、s1が指す文字列中で捜す。
:その文字が見つからない場合、s1が指す文字列には字句が存在せず、strtok関数は空ポインタを返す。
:その文字が見つかった場合、それを最初に字句の始まりとする。
:次に、strtok関数は、見つかった文字の位置からその時点での区切り文字列に含まれている文字を捜す。その文字が見つからない場合、その時点の字句をs1が指す文字列の最後までとみなし、次回以降の探索では空ポインタを返す。
:その文字が見つかった場合、その文字をナル文字で書き換え、その時点の字句を終了させる。
:strtok関数はその次の文字へのポインタを保持しておき、字句の次の探索はそこから開始する。
:第1実引数の値が空ポインタを持つ2回目以降の各呼び出しでは、保持したポインタが指すところから探索を開始する以外は、これと同じ動作をする。
:処理系は、いかなるライブラリ関数もstrtok関数を呼び出さない場合の動作と同じ動作をしなければならない。
:返却値は、字句の最初の文字へのポインタを返す。
:字句が存在しない場合、空ポインタを返す。
; 例
: <syntaxhighlight lang=c>
774 ⟶ 805行目:
#include <string.h>
 
int main(void) {
char str[] = "abc def,ghi.";
{
char str[]*p = strtok(str, "abc def,ghi.");
char *p = strtokprintf(str"%s\n", " ,."p);
while (p != NULL) {
printf("%s\n", p);
while ( p != strtok(NULL), {" ,.");
printf("%s\n", p);
p = strtok(NULL, " ,.");
}
printf("%s\n", p);
}
}
</syntaxhighlight>
 
== その他の関数 ==
<ref>『JISX3010:2003』p.239「7.21.6 その他の関数」</ref>
800 ⟶ 831行目:
:
; 機能
:c(unsigned char型に型変換する。)の値を、sが指すオブジェクトの最初のn文字のそれぞれにコピーする。<br>
:返却値は、sの値を返す。
; 例
: <syntaxhighlight lang=c>
806 ⟶ 838行目:
#include <string.h>
 
int main(void) {
char s[6];
{
memset(s, 'a', 6);
int i;
char s[6];
memset(s, 'a', 6);
 
printf("\nsの値");
for (int i = 0; i < 6; i++)
printf("%2x ", s[i]);
}
</syntaxhighlight>
 
=== strerror関数 ===
; 形式
863 ⟶ 894行目:
:文字列の長さ
; 機能
:sが指す文字列の長さを計算する。<br>
:返却値は、終端ナル文字に先行する文字の個数を返す。
; 例
: <syntaxhighlight lang=c>
869 ⟶ 901行目:
#include <string.h>
 
int main(void) {
char s[] = "abcdef";
{
int len = strlen(s);
char s[] = "abcdef";
printf("%sの長さは%dです。\n", s, len);
int len;
len=strlen(s);
printf("%sの長さは%dです。\n", s, len);
}
</syntaxhighlight>
883 ⟶ 913行目:
== 参考文献 ==
* 国際標準化機構/国際電気標準会議 [https://www.iso.org/obp/ui/#iso:std:iso-iec:9899:ed-4:v1:en ISO/IEC 9899:2018(en) Information technology — Programming languages — C](2018-07-05)
* 日本工業標準調査会(現:日本産業標準調査会)『JISX3010 プログラム言語C』2003年12月20日改正
 
[[Category:C言語|string.h]]