📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
細 文字列「source lang」を「syntaxhighlight lang」に置換 |
|||
| (同じ利用者による、間の3版が非表示) | |||
| 7行目: | 7行目: | ||
'''注意'''<br> | '''注意'''<br> | ||
memset関数は、文字列の終端'\0'を自動的に付加しないので、'\0'以外の文字で埋める場合は、文字列の最後に終端'\0'を付加する必要がある。<br> | memset関数は、文字列の終端'\0'を自動的に付加しないので、'\0'以外の文字で埋める場合は、文字列の最後に終端'\0'を付加する必要がある。<br> | ||
< | <syntaxhighlight lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
| 26行目: | 26行目: | ||
return EXIT_SUCCESS; | return EXIT_SUCCESS; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 35行目: | 35行目: | ||
strncpy関数は、第2引数が指す文字列から、第1引数が指す文字列に最大で第3引数の文字数分をコピーする関数である。<br> | strncpy関数は、第2引数が指す文字列から、第1引数が指す文字列に最大で第3引数の文字数分をコピーする関数である。<br> | ||
なお、第2引数が指す文字列の終端'\0'に続く文字はコピーされない。<br> | なお、第2引数が指す文字列の終端'\0'に続く文字はコピーされない。<br> | ||
< | <syntaxhighlight lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
| 64行目: | 64行目: | ||
return EXIT_SUCCESS; | return EXIT_SUCCESS; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
'''注意'''<br> | '''注意'''<br> | ||
| 72行目: | 72行目: | ||
最も簡単な対策法としては、コピー後の文字列のn - 1番目の要素に'\0'をセットする方法がある。<br> | 最も簡単な対策法としては、コピー後の文字列のn - 1番目の要素に'\0'をセットする方法がある。<br> | ||
具体的には以下のように実装する。<br> | 具体的には以下のように実装する。<br> | ||
< | <syntaxhighlight lang="c"> | ||
strncpy(s1, s2, n); | strncpy(s1, s2, n); | ||
if (n > 0) | if (n > 0) | ||
| 78行目: | 78行目: | ||
s1[n - 1] = '\0'; | s1[n - 1] = '\0'; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 87行目: | 87行目: | ||
strncat関数は、第2引数が指す文字列から最大で第3引数の文字数分の文字列を、第1引数が指す文字列の最後に付加する。<br> | strncat関数は、第2引数が指す文字列から最大で第3引数の文字数分の文字列を、第1引数が指す文字列の最後に付加する。<br> | ||
なお、文字列の終端'\0'は自動的に付加されるので、第3引数の値が第2引数のサイズよりも小さい場合でも、手動で'\0'を付加する必要はない。<br> | なお、文字列の終端'\0'は自動的に付加されるので、第3引数の値が第2引数のサイズよりも小さい場合でも、手動で'\0'を付加する必要はない。<br> | ||
< | <syntaxhighlight lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
| 105行目: | 105行目: | ||
return EXIT_SUCCESS; | return EXIT_SUCCESS; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 116行目: | 116行目: | ||
2回目以降の呼び出しは、第1引数にNULLを指定することで、前回分割された場所の次から分割を開始する。<br> | 2回目以降の呼び出しは、第1引数にNULLを指定することで、前回分割された場所の次から分割を開始する。<br> | ||
分割できる文字列がなくなると、strtok関数はNULLを返す。<br> | 分割できる文字列がなくなると、strtok関数はNULLを返す。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
| 143行目: | 143行目: | ||
return EXIT_SUCCESS; | return EXIT_SUCCESS; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 157行目: | 157行目: | ||
# 手順 4 で探した位置から末尾まで文字列をコピーする | # 手順 4 で探した位置から末尾まで文字列をコピーする | ||
<br> | <br> | ||
< | <syntaxhighlight lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
| 206行目: | 206行目: | ||
return i + count; | return i + count; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 215行目: | 215行目: | ||
# 文字列の先頭から順番に空白でない位置を探す | # 文字列の先頭から順番に空白でない位置を探す | ||
# 手順 1 で探した位置から末尾まで文字列をコピーする | # 手順 1 で探した位置から末尾まで文字列をコピーする | ||
< | <syntaxhighlight lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
| 253行目: | 253行目: | ||
return i; | return i; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 262行目: | 262行目: | ||
# 手順1で探した末尾から順に、空白でない位置を探す | # 手順1で探した末尾から順に、空白でない位置を探す | ||
# 手順2で探した位置 + 1 に終端の'\0'を付加する | # 手順2で探した位置 + 1 に終端の'\0'を付加する | ||
< | <syntaxhighlight lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
| 306行目: | 306行目: | ||
return count; | return count; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 312行目: | 312行目: | ||
C言語で文字列の長さを取得するには、string.hのstrlen関数を使用する。<br> | C言語で文字列の長さを取得するには、string.hのstrlen関数を使用する。<br> | ||
strlen関数は、第1引数が指す文字列の長さを取得する関数である。なお、文字列の長さに終端'\0'は含まない。<br> | strlen関数は、第1引数が指す文字列の長さを取得する関数である。なお、文字列の長さに終端'\0'は含まない。<br> | ||
< | <syntaxhighlight lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
| 327行目: | 327行目: | ||
return EXIT_SUCCESS; | return EXIT_SUCCESS; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 339行目: | 339行目: | ||
<br> | <br> | ||
strcmp関数とstrncmp関数は、比較する文字列が同じなら0、第1引数 > 第2引数なら正の整数、第1引数 < 第2引数なら負の整数を返す。<br> | strcmp関数とstrncmp関数は、比較する文字列が同じなら0、第1引数 > 第2引数なら正の整数、第1引数 < 第2引数なら負の整数を返す。<br> | ||
< | <syntaxhighlight lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
| 371行目: | 371行目: | ||
return EXIT_SUCCESS; | return EXIT_SUCCESS; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 378行目: | 378行目: | ||
実装方法としては,文字列を構成する文字を1文字ずつ大文字に変換して比較を行えばよい。<br> | 実装方法としては,文字列を構成する文字を1文字ずつ大文字に変換して比較を行えばよい。<br> | ||
なお、以下の例では文字を大文字に変換するためにctype.hのtoupper関数を使用している。<br> | なお、以下の例では文字を大文字に変換するためにctype.hのtoupper関数を使用している。<br> | ||
< | <syntaxhighlight lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
| 445行目: | 445行目: | ||
return toupper((unsigned char)s1[i]) - toupper((unsigned char)s2[i]); | return toupper((unsigned char)s1[i]) - toupper((unsigned char)s2[i]); | ||
} | } | ||
</ | </syntaxhighlight> | ||
/* 大文字小文字を区別せずに文字列をn文字分比較する */ | /* 大文字小文字を区別せずに文字列をn文字分比較する */ | ||
| 470行目: | 470行目: | ||
return toupper((unsigned char)s1[i]) - toupper((unsigned char)s2[i]); | return toupper((unsigned char)s1[i]) - toupper((unsigned char)s2[i]); | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 478行目: | 478行目: | ||
strchr関数は、文字が見つかった場合は探し出した文字へのポインタを返し、文字が見つからなかったときにはNULLを返す。<br> | strchr関数は、文字が見つかった場合は探し出した文字へのポインタを返し、文字が見つからなかったときにはNULLを返す。<br> | ||
探し出した文字へのポインタから文字列の先頭アドレスを引くことで、指定した文字が最初に現れる位置を求めることができる。<br> | 探し出した文字へのポインタから文字列の先頭アドレスを引くことで、指定した文字が最初に現れる位置を求めることができる。<br> | ||
< | <syntaxhighlight lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
| 504行目: | 504行目: | ||
return EXIT_SUCCESS; | return EXIT_SUCCESS; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 512行目: | 512行目: | ||
strrchr関数は、文字が見つかった場合は探し出した文字へのポインタを返し、文字が見つからなかった場合はNULLを返す。<br> | strrchr関数は、文字が見つかった場合は探し出した文字へのポインタを返し、文字が見つからなかった場合はNULLを返す。<br> | ||
探し出した文字へのポインタから文字列の先頭アドレスを引くことで,指定した文字が最後に現れる位置を求めることができる。<br> | 探し出した文字へのポインタから文字列の先頭アドレスを引くことで,指定した文字が最後に現れる位置を求めることができる。<br> | ||
< | <syntaxhighlight lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
| 538行目: | 538行目: | ||
return EXIT_SUCCESS; | return EXIT_SUCCESS; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 545行目: | 545行目: | ||
実装方法としては、文字列を構成する文字と検索する文字を一端大文字に変換して、1文字ずつ比較を行えばよい。<br> | 実装方法としては、文字列を構成する文字と検索する文字を一端大文字に変換して、1文字ずつ比較を行えばよい。<br> | ||
以下の例では、文字を大文字に変換するためにctype.hのtoupper関数を使用する。<br> | 以下の例では、文字を大文字に変換するためにctype.hのtoupper関数を使用する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
| 594行目: | 594行目: | ||
return NULL; | return NULL; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 604行目: | 604行目: | ||
<br> | <br> | ||
以下の例では、探し出した文字へのポインタから文字列の先頭アドレスを引くことで、指定した文字が最初に現れる位置を求めている。<br> | 以下の例では、探し出した文字へのポインタから文字列の先頭アドレスを引くことで、指定した文字が最初に現れる位置を求めている。<br> | ||
< | <syntaxhighlight lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
| 627行目: | 627行目: | ||
return EXIT_SUCCESS; | return EXIT_SUCCESS; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 636行目: | 636行目: | ||
strstr関数は、文字列が見つかった場合は探し出した文字列へのポインタを返し、文字列が見つからなかった場合はNULLを返す。<br> | strstr関数は、文字列が見つかった場合は探し出した文字列へのポインタを返し、文字列が見つからなかった場合はNULLを返す。<br> | ||
探し出した文字列へのポインタから検索対象の文字列の先頭アドレスを引くことで、指定した文字列が最初に現れる位置を求めることができる。<br> | 探し出した文字列へのポインタから検索対象の文字列の先頭アドレスを引くことで、指定した文字列が最初に現れる位置を求めることができる。<br> | ||
< | <syntaxhighlight lang="c"> | ||
#include <stdio.h> | #include <stdio.h> | ||
#include <stdlib.h> | #include <stdlib.h> | ||
| 658行目: | 658行目: | ||
return EXIT_SUCCESS; | return EXIT_SUCCESS; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
== 数値を文字列に変換する == | |||
C言語で数値を文字列に変換するには、stdio.hのsprintf関数またはsnprintf関数を使用する。<br> | |||
<br> | |||
sprintf関数は、第2引数が指す書式文字列に従って第1引数が指す文字配列へ書き込む関数である。<br> | |||
なお、文字配列に書き込んだ文字列の後には'\0'が自動的に書き込まれる。<br> | |||
<br> | |||
snprintf関数は、基本的にはsprintf関数と同じであるが、第2引数に最大文字数分を指定する。<br> | |||
(第2引数の値 - 1番目より後の出力文字は第1引数に書き込まずに破棄される)<br> | |||
<br> | |||
sprintf関数とsnprintf関数は共に、第2引数が指す書式文字列はprintf関数と同様のフォーマットで指定する。<br> | |||
変換指定子に%dや%fを指定することで、数値から文字列に変換することができる。<br> | |||
<syntaxhighlight lang="c"> | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#define N 256 | |||
int main(void) | |||
{ | |||
char s1[N] = {'\0'}; | |||
char s2[N] = {'\0'}; | |||
int i = 10000; | |||
double x = 200.123; | |||
sprintf(s1, "%d", i); | |||
snprintf(s2, N, "%.4f", x); | |||
fprintf(stdout, "s1: %s\n", s1); | |||
fprintf(stdout, "s2: %s\n", s2); | |||
return EXIT_SUCCESS; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== 文字列中の小文字を大文字に変換する == | |||
C言語の標準ライブラリ関数の中には、アルファベットの小文字を大文字に変換するtoupper関数がある。<br> | |||
文字列を構成するすべての文字に対して、toupper関数を適応させれば文字列中のすべての小文字を大文字に変換することができる。<br> | |||
具体的には以下のように実装する。<br> | |||
<syntaxhighlight lang="c"> | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <ctype.h> | |||
#define N 256 | |||
char *ToUpperString(char *s); | |||
int main(void) | |||
{ | |||
char s[N] = {'\0'}; | |||
/* 入力 */ | |||
printf("文字列を入力してください.\n> "); | |||
scanf("%s", s); | |||
/* 比較 */ | |||
ToUpperString(s); | |||
printf("変換後の文字列: %s\n", s); | |||
return EXIT_SUCCESS; | |||
} | |||
/* 文字列中の小文字を大文字に変換する */ | |||
/* @param[in,out] s 変換したい文字列 */ | |||
/* @return 変換後の文字列 (s) の先頭アドレス */ | |||
char *ToUpperString(char *s) | |||
{ | |||
int i = 0; | |||
while ( s[i] != '\0' ) | |||
{ | |||
s[i] = toupper((unsigned char)s[i]); | |||
i++; | |||
} | |||
return s; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
== 文字列中の大文字を小文字に変換する == | |||
C言語の標準ライブラリ関数には、アルファベットの大文字を小文字に変換するtolower関数がある。<br> | |||
文字列を構成するすべての文字に対して、tolower関数を適応させれば文字列中のすべての大文字を小文字に変換することができる。<br> | |||
具体的には以下のように実装する。<br> | |||
<syntaxhighlight lang="c"> | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <ctype.h> | |||
#define N 256 | |||
char *ToLowerString(char *s); | |||
int main(void) | |||
{ | |||
char s[N] = {'\0'}; | |||
/* 入力 */ | |||
printf("文字列を入力してください.\n> "); | |||
scanf("%s", s); | |||
/* 比較 */ | |||
ToLowerString(s); | |||
printf("変換後の文字列: %s\n", s); | |||
return EXIT_SUCCESS; | |||
} | |||
/* 文字列中の大文字を小文字に変換する */ | |||
/* @param[in,out] s 変換したい文字列 */ | |||
/* @return 変換後の文字列sの先頭アドレス */ | |||
char *ToLowerString(char *s) | |||
{ | |||
int i = 0; | |||
while ( s[i] != '\0' ) | |||
{ | |||
s[i] = tolower((unsigned char)s[i]); | |||
i++; | |||
} | |||
return s; | |||
} | |||
</syntaxhighlight> | |||
<br><br> | |||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:C]] | [[カテゴリ:C]] | ||