☜前の章へ 配列の基本(宣言・初期化・追加・要素数・多次元配列)
☞次の章へ ポインタとは
ここでは文字列の基本的な使い方から、文字列の基本的な操作までを学んでいきます。
文字列の基本的な使い方
①文字列を宣言する方法
#include <stdio.h>
int main(void) {
// 配列の宣言
char sintyo_a[6];
return 0;
}
C言語で文字列を宣言するためには、char型の配列を宣言します。
②宣言された文字列を初期化(代入)する方法
#include <stdio.h>
int main(void) {
// 配列の宣言
char sintyo_a[6];
// 代入、文字列ではなく、文字の配列
sintyo_a[0] = 'H';
sintyo_a[1] = 'e';
sintyo_a[2] = 'l';
sintyo_a[3] = 'l';
sintyo_a[4] = 'o';
sintyo_a[5] = '\0';
return 0;
}
C言語で配列を使うためには、配列の一番最後の要素に終端文字(\0)を追加する必要があります。
③文字列の宣言と初期化を同時にする方法
#include <stdio.h>
int main(void) {
// C言語の文字列は終端文字(\0)を最後に入れる必要がある
char sintyo_a[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
// ダブルクォーテーションで文字列を囲んで初期化もできる
// この場合終端文字は自動で追加される
char sintyo_b[6] = {"Hello"};
// 要素数を指定しなくても初期化できる
char sintyo_c[] = {'H', 'e', 'l', 'l', 'o', '\0'};
char sintyo_d[] = {"Hello"};
return 0;
}
文字を1つ1つ'(シングルクォーテーション)で囲むことで宣言と初期化を同時に行うことが出来ます。
“ダブルクォーテーションで文字列を囲むことでも宣言と初期化を同時に行うことが出来ます。この場合、終端文字が自動的に追加されます。
④文字列の出力方法
#include <stdio.h>
int main(void) {
// C言語の文字列は終端文字(\0)を最後に入れる必要がある
char sintyo_a[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
// ダブルクォーテーションで文字列を囲んで初期化もできる
// この場合終端文字は自動で追加される
char sintyo_b[6] = {"Hello"};
// 要素数を指定しなくても初期化できる
char sintyo_c[] = {'H', 'e', 'l', 'l', 'o', '\0'};
char sintyo_d[] = {"Hello"};
printf("sintyo_a=");
// ループで表示することができる
for (int i = 0; i < 5; i++)
{
printf("%c",sintyo_a[i]);
}
printf("\n");
//文字列だと%sとするだけで表示できる
printf("sintyo_b=%s\n", sintyo_b);
printf("sintyo_c=%s\n", sintyo_c);
printf("sintyo_d=%s\n", sintyo_d);
return 0;
}
出力結果
ループで1文字1文字出力することもできますが、文字列の場合、printfで%sを使用すると簡単に出力することができます。
文字列をキーボード入力する方法
#include <stdio.h>
int main(void) {
char s[10];
printf("何か文字列を入力してください。\n");
scanf("%s", s);
printf("入力された文字列=%s\n", s);
return 0;
}
scanf関数を使用するとキーボードから文字を入力して、その値を使用することができます。
キーボード入力を使うことで、例えばクイズゲームなどを作成することが出来ます。
これまで学習した知識でクイズゲームは作成可能です。是非色々なものの作成にチャレンジしてみて下さい。
文字列の基本操作と応用
①文字列の比較|strcmp関数の使い方
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[] = "Hello";
char str2[] = "World";
int result = strcmp(str1, str2);
if (result == 0) {
printf("str1とstr2は等しい\n");
} else {
printf("str1とstr2は等しくない\n");
}
return 0;
}
出力結果
strcmp関数は、#include <string.h>と冒頭に書くことで使用できます。
文字列が同じであれば、0を返します。
②文字列の比較|strncmp関数の使い方
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[] = "Hello";
char str2[] = "Helee";
int result = strncmp(str1, str2, 3);
if (result == 0) {
printf("str1とstr2は3文字まで等しい\n");
} else {
printf("str1とstr2は等しくない\n");
}
return 0;
}
出力結果
strncmp関数は、#include <string.h>と冒頭に書くことで使用できます。
strncmp関数は、比較したい数字分の文字を文字列の先頭から比較します。
文字列が同じであれば、0を返します。
③文字列の長さの取得|strlen関数の使い方
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[] = "Hello";
int length = strlen(str1);
printf("文字列の長さ: %d\n", length);
return 0;
}
出力結果
strlen関数は、#include <string.h>と冒頭に書くことで使用できます。
strlen関数は、文字列の終端文字を除いた文字数を取得します。
④文字列の連結|strcat関数の使い方
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[20] = "Hello";
char str2[] = " World";
strcat(str1, str2);
printf("連結後の文字列: %s\n", str1);
return 0;
}
出力結果
strcat関数は、#include <string.h>と冒頭に書くことで使用できます。
strcat関数は、第一引数の変数に第二引数の変数を連結します。
⑤文字列の連結|strncat関数の使い方
#include <stdio.h>
#include <string.h>
int main(void) {
char str1[20] = "Hello";
char str2[] = "1234567891011121314151617";
strncat(str1, str2, sizeof(str1) - strlen(str1) - 1);
printf("連結後の文字列: %s\n", str1);
return 0;
}
出力結果
strncat関数は、#include <string.h>と冒頭に書くことで使用できます。
strncat関数は、第一引数の変数に第二引数の変数を連結します。
第三引数で連結後の最大文字数を指定することが出来ます。
これにより、バッファオーバーフローを防ぐことができます。
⑥文字列のコピー(切り出し)|strncpy関数の使い方
#include <stdio.h>
#include <string.h>
int main(void) {
char str[] = "Hello, World!";
char sub_str[6]; // 切り出したい部分のサイズ+1(終端文字分)の配列を用意
// strから部分文字列を切り出す
strncpy(sub_str, str + 7, 5);
sub_str[5] = '\0'; // 切り出した部分の終端文字を追加
// 切り出した部分文字列を表示
printf("切り出した部分文字列: %s\n", sub_str);
return 0;
}
出力結果
strncpy関数は、#include <string.h>と冒頭に書くことで使用できます。
strncpy関数は、第一引数の変数に第二引数の変数をコピーします。
第二引数に変数のみ書く場合は、1文字目からコピーされますが、「+ 7」のように、先頭から何文字目からコピーするかを指定することもできます。
第三引数でコピーしたい文字数を指定します。
⑦文字列を逆順にする方法
#include <stdio.h>
#include <string.h>
void reverseString(char str[]) {
int length = strlen(str);
int start = 0;
int end = length - 1;
while (start < end) {
// 先頭と末尾の文字を交換
char temp = str[start];
str[start] = str[end];
str[end] = temp;
// 次の位置に移動
start++;
end--;
}
}
int main(void) {
char str[] = "Hello, World!";
// 文字列を逆順にする
reverseString(str);
// 逆順になった文字列を表示
printf("逆順になった文字列: %s\n", str);
return 0;
}
出力結果
文字列を逆順にするために、reverseString関数を作成しました。
配列も関数の引数として渡すことが出来ます。
配列を関数の引数で渡すと、関数内で配列を変更することが出来ます。
ループ内で文字列の先頭と末尾を交換して文字列を逆順にしています。
練習問題
#include <stdio.h>
int main() {
// 初期化
char message[] = {"ありがとう"};
// 表示
printf("メッセージ:");
printf("%s\n", message);
return 0;
}
#include <stdio.h>
int main() {
char s[10];
printf("名前を入力してください\n");
scanf("%s", s);
printf("名前:%s\n", s);
return 0;
}