この記事では、C言語で文字列を扱う方法を解説します。
C言語ではString
などの文字列を扱うための型がありません。なので、文字型であるchar
を使って文字列を使います。
それでは、C言語で文字列を扱う方法を見ていきましょう!
文字列を使うにはchar
型の配列、またはchar
型のポインタを使います。
char
型の配列を使うことで文字列を扱うことができます。文字列の最後には終端文字(\0)
を格納する決まりになっています。
宣言
char型の配列を使った文字列の使い方を見ていきます。char型の配列を宣言するには、変数名のあとに[]
を使って文字列の長さ(サイズ)を指定します。
char 変数名[文字列の長さ];
文字列の初期化
以下のように、宣言と初期化を同時に行うことができます。
char 変数名[文字列の長さ] = {'文字1', '文字2', ..., '文字N'};
// 文字列の長さを省略できる
char 変数名[] = {'文字1', '文字2', ..., '文字N'};
また、文字列リテラルで初期化することもできます。
char 変数名[文字列の長さ] = "文字列リテラル";
// 文字列の長さを省略できる
char 変数名[] = "文字列リテラル";
文字列の長さを指定する場合は、終端文字を含めた長さを指定する必要があります。例えば「Hello」で初期化したい場合、文字列の長さに「6」を指定します。
char s[6] = "Hello";
また、文字列を初期化すると自動で最後に終端文字を付けてくれます。
サンプル
以下のコードでは、文字列を宣言・初期化して色々な方法で出力しています。
#include <stdio.h>
int main(void) {
// 文字列を宣言・初期化
char text[] = "Hello";
// 文字列の長さ
int len = sizeof(text);
// %sで文字列を出力できます
printf("text: %s\n", text);
// 1文字ずつ出力
for (int i = 0; i < len; i++)
{
printf("%d: %c\n", i+1, text[i]);
}
// 最後の文字が終端文字かどうか
if(text[len-1] == '\0')
{
printf("%d番目の文字は終端文字です\n", len);
}
return 0;
}
実行結果
text: Hello
1: H
2: e
3: l
4: l
5: o
6:
6番目の文字は終端文字です
char
型のポイントを使うことでも文字列を扱うことができます。
書式
char型のポインタは、以下のように宣言・初期化することができます。
char* ポインタ名 = "文字列リテラル";
サンプル
先ほどのサンプルコードをchar型のポインタを使って書き換えてみます。
#include <stdio.h>
// 文字列を扱うためのヘッダーファイル(後述)
#include <string.h>
int main(void) {
// 文字列を宣言・初期化
char* text = "Hello";
// 文字列の長さを関数で測る(終端文字は含まれない)
int length = strlen(text) + 1;
// %sで文字列を出力できます
printf("text: %s\n", text);
// 1文字ずつ出力
for (int i = 0; i < length; i++)
{
printf("%d: %c\n", i+1, text[i]);
}
// 最後の文字が終端文字かどうか
if(text[length-1] == '\0')
{
printf("%d番目の文字は終端文字です\n", length);
}
return 0;
}
実行結果
text: Hello
1: H
2: e
3: l
4: l
5: o
6:
6番目の文字は終端文字です
C言語には、文字列を扱うための関数が標準ライブラリに多数用意されています。これらの関数を使用するにはstring.h
をインクルードする必要があります。
引数に指定した文字列の終端文字を除いた長さを取得します。
#include <stdio.h>
#include <string.h> // インクルード
int main(void) {
char* text = "Hello";
int len = strlen(text);
printf("文字列の長さ: %d\n", len);
return 0;
}
実行結果
文字列の長さ: 5
文字列をコピーするには、strcpy
またはstrncpy
関数を使います。strncpy
関数は、文字数を指定してコピーします。
#include <stdio.h>
#include <string.h> // インクルード
int main(void) {
char text[] = "Hello";
char cpy1[8], cpy2[8];
// コピー
strcpy(cpy1, text);
printf("cpy1: %s\n", cpy1);
// 文字数を指定してコピー
strncpy(cpy2, text, 2);
printf("cpy2: %s\n", cpy2);
return 0;
}
実行結果
cpy1: Hello
cpy2: He
文字列を連結するには、strcat
関数を使います。第一引数の文字列に第二引数の文字列を連結させます。
#include <stdio.h>
#include <string.h> // インクルード
int main(void) {
char str1[16] = "tanaka ";
char str2[] = "taro";
// 文字列の連結
strcat(str1, str2);
printf("str1: %s\n", str1);
return 0;
}
実行結果
str1: tanaka taro
3つ以上の文字列を連結させたい場合は、sprintf
関数を使います。
#include stdio.h
#include string.h // インクルード
int main(void) {
char* str1 = "ab";
char* str2 = "cd";
char* str3 = "ef";
char str[32];
// sprintf(代入する文字列名, "出力文字列書式", 文字列1, 文字列2, ...)
sprintf(str, "%s %s %s", str1, str2, str3);
printf("%s\n", str);
return 0;
}
実行結果
ab cd ef
文字列を比較するには、strcmp
関数を使います。引数に指定した2つの文字列が等しければ整数値の0が返されます。
#include <stdio.h>
#include <string.h> // インクルード
int main(void) {
char* str1 = "ab";
char* str2 = "ab";
char* str3 = "cd";
printf("str1 == str2: %d\n", strcmp(str1, str2));
printf("str1 == str2: %d\n", strcmp(str1, str3));
}
実行結果
str1 == str2: 0
str1 == str2: -2
文字列中の文字を検索するには、strchr
関数を使います。第一引数に指定した文字列の中から第二引数で指定した文字を探し、最初に見つけた文字の位置をポインタで返します。
#include <stdio.h>
#include <string.h> // インクルード
int main(void) {
char* str = "abcd abcd";
char* p;
p = strchr(str, 'c');
printf("%s\n", p);
}
実行結果
cd abcd
文字列中の文字列を検索するには、strstr関数を使います。
#include <stdio.h>
#include <string.h> // インクルード
int main(void) {
char* str = "abcd abcd";
char* p;
p = strstr(str, "bc");
printf("%s\n", p);
}
実行結果
bcd abcd
この記事では、C言語で文字列を使う方法を解説しました。
文字列を使うにはchar型の「配列」か「ポインタ」を使います。また、string.h
の関数は便利なのでよく覚えておきましょう!
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ