C言語の文字列:初心者向けガイド

こんにちは、将来のプログラマーたち!今日は、C言語の文字列の世界への興味深い旅を始めます。プログラミングに全く新しい方でも心配しないでください。私はあなたの親切なガイドとして、ステップバイステップで進めます。このチュートリアルの終わりまでに、あなたはCで文字列を扱うプロのようになるでしょう!

C - Strings

C言語の文字列とは?

まず基本から始めましょう。C言語では、文字列は文字のシーケンスです。これを、各珠が文字であるようなネックレス比喻してみましょう。これらの文字は連続したメモリ領域に格納され、null文字('\0')で終了します。

ここに面白い事実があります:C言語では、文字列のための別のデータ型はありません。代わりに、文字の配列を使って文字列を表現します。これは、一連の郵便ポストを使って一連の手紙を保管するのに似ています!

C言語で文字列を作成する

では、手を汚して最初の文字列を作成してみましょう。いくつかの方法がありますが、最も簡単な方法から始めます:

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

この例では、'Hello'という単語を含むgreetingという文字列を作成しています。これを分解してみましょう:

  • charは文字のデータ型です。
  • greetingは私たちの文字列の名前です。
  • [6]は配列のサイズを指定します。'Hello'には5つのスペースが必要で、null文字のために1つが必要です。
  • 文字は单引用で括られ、カンマで区切られています。
  • 最後にnull文字'\0'を忘れないでください!

サイズを指定しないで文字列を初期化する

Cは非常に賢く、文字列のサイズを自分で判断できます。見てください:

char greeting[] = "Hello";

これってすごいですね?Cは自動的にnull文字を追加し、サイズを計算します。まるで魔法のようですが、这只是Cが効率的である而已!

文字列をループで処理する

文字列を作成したので、それをループで処理する方法を学びましょう。これは各文字を個別に処理したいときに便利です:

#include <stdio.h>

int main() {
char greeting[] = "Hello";
int i = 0;

while (greeting[i] != '\0') {
printf("%c", greeting[i]);
i++;
}

return 0;
}

このコードは、"Hello"の各文字を順次印刷します。ループはnull文字に達するまで続きます。null文字は文字列の終わりを示します。

文字列を印刷する(%sフォーマット指定子を使う)

文字列を文字ごとにループで処理するのは楽しいですが、もっと簡単な方法もあります:

#include <stdio.h>

int main() {
char greeting[] = "Hello, World!";
printf("%s", greeting);
return 0;
}

%sフォーマット指定子は、printfに文字列が来ることを知らせます。まるでprintfに「おい、文字列が来るぞ!」と伝えるようなものです!

二重引用符を使って文字列を構築する

初めての例で文字列を文字ごとに作成したことを覚えていますか?それにはショートカットがあります:

char greeting[] = "Hello, World!";

これは前の例と同じことを行いますが、より簡潔です。Cは自動的にnull文字を追加します。まるで予め組み立てられたネックレスを注文するようなものです!

scanf()を使って文字列入力する

では、ユーザーからの入力をプログラムに追加してインタラクティブにしてみましょう:

#include <stdio.h>

int main() {
char name[50];
printf("あなたの名前を入力してください: ");
scanf("%s", name);
printf("こんにちは, %s!\n", name);
return 0;
}

ここでは、scanf()を使ってユーザーから文字列を読み取ります。しかし注意!scanf()は最初の空白文字に達すると読み取りを停止します。したがって、「John Doe」と入力すると、「John」だけがnameに格納されます。

空白文字を含む文字列入力

空白文字を含む文字列入力には、以下のフォーマット指定子を使います:

#include <stdio.h>

int main() {
char fullName[100];
printf("あなたの全名を入力してください: ");
scanf("%[^\n]s", fullName);
printf("こんにちは, %s!\n", fullName);
return 0;
}

%[^\n]sフォーマット指定子は、scanf()が改行文字に達するまで読み取ります。これにより、空白を含む全名や文章を読み取ることができます。

gets()fgets()関数を使って文字列入力する

gets()は簡単ですが、境界チェックを行わないため安全ではありません。代わりに、より安全なfgets()関数を使いましょう:

#include <stdio.h>

int main() {
char sentence[100];
printf("文章を入力してください: ");
fgets(sentence, sizeof(sentence), stdin);
printf("あなたが入力したのは: %s", sentence);
return 0;
}

fgets()は安全です because it allows you to specify the maximum number of characters to read, preventing buffer overflows.

文字列を印刷するためのputs()fputs()関数

最後に、文字列を印刷するための代替方法を見てみましょう:

#include <stdio.h>

int main() {
char greeting[] = "Hello, World!";
puts(greeting);  // `puts()`は自動的に改行を追加します
fputs(greeting, stdout);  // `fputs()`は改行を追加しません
return 0;
}

puts()はシンプルで自動的に改行を追加します。一方、fputs()は出力に対してより多くの制御を提供します。

以下に、私たちがカバーした文字列関数の表を示します:

関数 目的
scanf() フォーマットされた入力を読み取る scanf("%s", str);
gets() 一行を読み取る(安全でない、使用を避ける) gets(str);
fgets() 一行を安全に読み取る fgets(str, size, stdin);
printf() フォーマットされた出力を印刷する printf("%s", str);
puts() 文字列を印刷し、改行を追加する puts(str);
fputs() 文字列を印刷し、改行を追加しない fputs(str, stdout);

そして、ここまでであなたはC言語の文字列の世界への最初のステップを踏み出しました。練習は完璧を生みますので、これらの概念を試してみてください。ハッピーコーディング、そしてあなたの文字列は常にnull終端符付きでありますように!

Credits: Image by storyset